Я учусь читать и писать из файла . Есть проблема, что когда я пытаюсь записать (--что-то в файл букву например--) после чтения или прочитать после записи в файл
используя fstream
Происходит что-то не так. Я пытался просто писать или читать, и это сработало. в чем проблема?
содержимое файла:
abcdefgh
ijklmnopqr
stuvw
xyz
и код:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
fstream ioFile;
char ch;
ioFile.open("search.txt", ios::in | ios::out);
if (!ioFile)
{
cout << "problem opening the file";
goto k270;
}
while (ioFile>>ch)
{
if (ch == 'z')
{
ioFile.seekp(((int)ioFile.tellg()));
ioFile << "x";
}
}
//cout<<ioFile.rdbuf();
ioFile.close();
k270:
system("pause");
return 0;
}
В будущих вопросах замените «происходит что-то не так» на то, что на самом деле происходит неожиданно.
@RetiredNinja спасибо за ваш отзыв, я сделаю это для будущих вопросов
@Someprogrammerdude Хорошо, вы правы, я так и сделал, но когда я пишу в файл, цикл снова и снова возвращается к началу файла.
В сторону: напишите char, а не строку... "x" - это строка.
@Jean-BaptisteYunès хорошо, я отредактировал
Посмотрите на этот ответ: https://stackoverflow.com/a/17567454/11829247 объясняет ошибку, с которой вы столкнулись.
Краткая версия: ввод и вывод буферизуются, а чередование чтения и записи работает только в том случае, если вы принудительно обновляете буфер между ними.
Это работает для меня:
#include <iostream>
#include <fstream>
#include <string>
int main()
{
std::fstream ioFile;
char ch;
ioFile.open("search.txt", std::ios::in | std::ios::out);
if (!ioFile)
{
std::cout << "problem opening the file";
return 1;
}
while (ioFile >> ch)
{
if (ch == 'z')
{
ioFile.seekp(-1, std::ios_base::cur);
ioFile << "x";
ioFile.flush();
}
}
ioFile.close();
return 0;
}
Разница в том, что я использую ioFile.seekp(-1, std::ios_base::cur);
для перемещения на один шаг назад от позиции cur
rent. Вы также можете использовать ioFile.seekp((int)ioFile.tellg() -1);
— обратите внимание на -1
.
Затем, сделав шаг назад и перезаписав z, используйте ioFile.flush();
, чтобы принудительно отправить запись в файл. Это также означает, что буфер чтения обновляется, без этого операция чтения просто делает шаг назад в своем буфере и продолжает читать то же буферизованное значение z.
Ваш код не перезапишет
z
в файле. Как только вы прочиталиz
, вы находитесь на одной позиции внеz
, и именно эта позиция будет возвращенаtellg()
. Вам нужно получить позицию до, которую вы прочиталиz
. Или вычтите один, чтобы вернуться кz
.