Как мне прочитать пустой файл в C ++?
Какие условия цикла я использую, чтобы прочитать пустой файл?
Так как !fin.eof()
условие не работает и создает бесконечный цикл.
Я использую Turbo C ++ и у меня есть 2 файла. Файл музыкальной библиотеки уже содержит несколько альбомов. Мне нужно отфильтровать и удалить повторяющиеся альбомы и добавить его в фильтр-файл.
Мой код следующий:
void albumfilter()
{
song s;
album a;
ifstream fin;
fstream finout;
fin.open("Musiclibrary.txt", ios::binary);
while(!fin.eof())
{
fin.read((char*)&s,sizeof(s));
if(fin.eof())
break;
finout.open("Filteralbum.txt", ios::binary| ios::in| ios::out);
while(!finout.eof())
{
finout.read((char*)&a, sizeof(a));
if(strcmp(a.getfilter_albumname(), s.getalbum())!=0)
{
strcpy(a.getfilter_albumname(),s.getalbum());
finout.write((char*)&a, sizeof(a));
finout.close();
}
}
}
fin.close();
}
Этот код правильный?
eof()
будет установлен только тогда, когда будет сделана попытка чтения за концом файла: вы должны попытаться прочитать хотя бы один раз. От std::basic_ios::eof
:
Эта функция только сообщает о состоянии потока, установленном самой последней операцией ввода-вывода, но не проверяет связанный источник данных. Например, если последний ввод-вывод был get (), который возвратил последний байт файла, eof () возвращает false. Следующий get () ничего не читает и устанавливает eofbit. Только тогда eof () возвращает true.
Так же, как вы читаете непустой файл, вы помещаете операцию чтения как условие для цикла. Код должен быть понятен:
std::vector<std::string> lines;
std::ifstream file("file.x");
if (file.is_open()) {
while (std::getline(file, line)) { // you can use operator>> here, too
lines.push_back(line);
}
if (file.bad() || file.fail()) {
std::cout << "An error occured during reading.";
} else if (lines.empty()) {
std::cout << "The file is empty.";
}
} else {
std::cout << "Couldn't open file.";
}
Если вы используете operator>>
читать что-то другое, чем std::string
s, то логика проверки ошибок меняется — возможно, что цикл заканчивается и eof еще не установлен. (Скажите, если вы читаете в int
s и операция извлечения встречает не цифру по пути). Вы должны принять это во внимание.
ifstream fin("empty-file.txt");
string line;
while(true){
fin>>line;
if(fin.eof())break;
}
Я думаю, что это должно сделать. Но почему вы хотите прочитать пустой файл?