#c #file-io #iostream
#c #file-io #iostream
Вопрос:
У меня есть текстовый файл с именами. Я хочу прочитать текстовый файл в поток, отобразить его на консоли. Когда это будет сделано, пользователю будет предложено ввести свое имя. Затем он должен добавить его в файл.
Я могу заставить его выполнять обе эти вещи по отдельности, но не вместе. Вот мой код.
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
using namespace System;
int main(array<System::String ^> ^args)
{
fstream myfile;
string line;
string name;
myfile.open("Names.txt",ios::out | ios::in | ios_base::app);
if (myfile.is_open())
{
while( getline(myfile, line) )
{
cout << line << endl;
}
cout << "Enter your name!n";
getline (cin, name);
myfile << name;
myfile.close();
}
else
{
cout << "file was not openedn";
}
return 0;
}
Если я оставлю там цикл while, он записывает все имена в консоль, но не добавляет введенное пользователем имя в список. Если я выну цикл while, я могу добавить имя к файлу, но тогда, конечно, я не получаю список имен, которые уже есть в этом файле.
Я думаю, что это может быть как-то связано с тем фактом, что после того, как я просматриваю файл с помощью getline, позиция находится в конце моего потока, поэтому, когда я пытаюсь добавить к нему имя, в потоке не остается места?
Комментарии:
1. Это не C :
array<System::String ^> ^args)
?!?2. Я использую Visual Studio, я выбрал консольное приложение CLR типа проекта. Это было сделано специально для меня.
3. Похоже, тогда вам нужно больше тегов.
4. Довольно новичок в C , как объясняет мой вопрос. Повлияет ли это на то, что я пытаюсь сделать с этим файлом ввода-вывода?
5. Я не думаю , что это произойдет, но я не могу сказать наверняка.
Ответ №1:
Ваше предположение верно.
Последний вызов getline()
(тот, который не удался) установил флаги ошибок в вашем потоке, что приведет к сбою при любых дальнейших попытках ввода-вывода, поэтому в вашем файле фактически ничего не записано.
Вы можете сбросить флаги ошибок с clear()
помощью after цикла чтения :
myfile.clear();
Примечание:
Вы также должны проверить возвращаемое значение вашего последнего getline()
вызова.
Комментарии:
1. Большое спасибо! Приятно, когда исправить что-то простое.
Ответ №2:
Просто столкнулся с этой проблемой, и, хотя здесь есть принятый ответ, я думаю, что можно использовать полный код, который показывает, как использовать канонический цикл чтения файлов C :
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
using namespace System;
int main(array<System::String ^> ^args)
{
fstream myfile;
string line;
string name;
myfile.open("Names.txt",ios::out | ios::in | ios_base::app);
if (myfile.is_open())
{
while( getline(myfile, line) )
cout << line << endl;
if (file_list.eof())
file_list.clear(); //otherwise we can't do any further I/O
else if (file_list.bad()) {
std::cout << "Error occured while reading file";
return 1;
}
cout << "Enter your name!n";
getline (cin, name);
myfile << name;
myfile.close();
}
else
{
cout << "file was not openedn";
}
return 0;
}