Я изучаю основы обработки файлов данных в C ++ (и работаю в компиляторе Turbo C ++).
Поэтому я хотел создать текстовый файл, записать в него некоторые данные и затем прочитать их.
Итак, я написал это:
int main()
{
fstream fin;
fin.open("textfile.txt",ios::in|ios::out);
for(int i=0;i<3;i++)
{
char x;
cin>>x;
fin<<x;
}
fin.seekg(0,ios::beg); //I added this and also tried seekp() when I didn't get the desired output
//but to no use
while(!fin.eof())
{
char v;
fin>>v;
cout<<v;
}
fin.close();
getch();
return 0;
}
Но вместо того, чтобы выводить только 3 символа, которые я ввожу, он выводит 4 символа.
Я попытался удалить циклы и взять входные данные и дать выходные данные один за другим, как это (среди прочего):
...
char x,y,z;
cin>>x>>y>>z;
fin<<x<<y<<z;
fin.seekg(0,ios::beg);
char q,w,e;
fin>>q>>w>>e;
cout<<q<<w<<e;
...
Но это все равно не сработало.
Я думаю, что это как-то связано с указателями файлов и их расположением, но я не знаю что. Я попытался найти аналогичный вопрос в сети, но безрезультатно.
Поэтому я хочу знать, что не так с тем, что я сделал, и как я могу улучшить это, чтобы фактически записывать и читать в файл последовательно, используя один и тот же файловый объект (если это даже возможно). И нужна ли здесь функция seekg ()?
Благодарю.
Проблема, с которой вы сталкиваетесь, является общей проблемой. Ваш входной код правильный и в этом нет ошибки. Проблема в том, что ваш выходной код и, если быть более точным, строка while(!fin.eof())
, eof (конец файла) работает с меткой конца файла, числовое значение которой обычно равно -1. Но эта функция становится ложной только тогда, когда конечный символ встречается и пересекается. Чтобы удалить эту ошибку, просто замените этот оператор на оператор чтения, который переместит эту строку fin>>v
от операторов цикла к условным операторам. При этом ложь будет, когда встретится с конечным символом.
Других решений пока нет …