argon bulletin board
Факултети => Факултет по математика и информатика => Темата е започната от: ***** в 20.01.2010, 01:49:50
-
Ако може малко помощ за следната задача...
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
char a[100][256];
string line;
int i;
void spisak()
{
int n;
cout<<"Kolko edi kvo si- ";cin>>n;
cin.ignore();
ifstream file ("d://spisak.txt");
for (i=0;i<=n;i++)
{
getline(file,line)>>a; //Тук се присвоява низа от елементи от всеки рет на файла към съответния елемент от масива a
cout<<"№["<<i<<"]="<<a<<endl;
}
}
Пример: Ако във файла има
Иван Вазов
Еди кой си
Жан Клод Ван Дам
Резултат:
За a[0]=Иван
За a[1]=Еди
За a[2]=Жан
А целта е:
За a[0]=Иван Вазов
За a[1]=Еди кой си
За a[2]=Жан Клод Ван Дам
Тоест, как да направя така, че да не пренебрегва интервала и да се присвоят елементите до края на реда, без да бъде променян типа на променливите?
Мерси
edit:Навсякъде където има а го съпровождат квадратни скоби с i просто не се отпечатва нещо...
-
Я пробвай функцията fgets(). Намира се в stdio.h демек #include<cstdio> и сигнатурата му е:
char *fgets(char *s, int size, FILE *stream);
Демек подаваш за s буфера, в който да ти прочете реда, size ти е максимално колко да чете, stream ти е файла stream-а. Функцията чете до нов ред като го включва в прочетеното, та ще трябва да го махаш, ако не ти трябва. Проверката за край ти е връщаната стойност дали е NULL.
Подробност: Трябва да ползваш С варианта на работа с файлове, а не ifstream библиотеката. Не знам дали сте го учили. http://www.cprogramming.com/tutorial/cfileio.html Абе като цяло моето решение е за С, не за С++.
Поздрави
-
Нямам време да ти компилирам и анализирам решението ти, но ето ти малко съвети и трикове за вход/изхода в С++ стил http://augustcouncil.com/~tgibson/tutorial/iotips.html
Антоний, твоето решение сигурно ще работи, но човека иска С++ стил.
За автора на темата: Все пак, което забелязвам, нямаш никъде проверка за грешки и по-скоро бъркаш името на файла, това "d://spisak.txt" хич не ми харесва. Трябва да е "d:\\spisak.txt".
Затова, винаги след отваряне и/или четене от файла, се проверява дали е успешна операцията! Как става това... Друга тема!
-
Антоний, мерси, но предпочитам да е в c++ стил.
Гн. Енков благодаря за линка, има интересни неща, но не намерих отговор на конкретния проблем.
Колкото до проверката за грешки и в частност дали съществува такъв файл -умишлено е прескочена, файлът съществува със сигурност.
Иначе наистина "d:\\spisak.txt" изглежда по-правилно от "d://spisak.txt", но компилатора не ми прави проблем за това и си открива файла.
-
Стана, но не съвсем.
При n=5
Ако във файла има
Иван Вазов
Еди кой си
Жан Клод Ван Дам
Онзи другия
123456
Резултат
За a[0]=
За a[1]=
За a[2]=Иван Вазов
За a[3]=Еди кой си
За a[4]=Жан Клод Ван Дам
При n=3
Резултат
За a[0]=
За a[1]=
За a[2]=Иван Вазов
Тоест поради някаква причина присвоява първия ред на файла към третия елемент на масива втория към четвъртия и тъка...
Това не е голям проблем, просто ми е интересно, защо става така.Някакви идеи?
Eто го и кода
for (i=0;i<n;i++)
{
file.getline(a,256);
cout<<"№["<<i<<"]="<<a<<endl;
}
По-сериозния проблем е, че като му задам примерно да отпечата шестия символ в четвъртия масив
cout<<"a[3][6]= "<<a[3][6]<<endl;
Резултат
a[3][6]=й
Цел
a[3][6]=о
Тоест, пак прескача интервала, а не желая.Как да го оправя?