0

如何在 C++ 中读取一个空文件?

我用什么while循环条件来读取空文件?

因为!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();
}

这段代码正确吗?

4

3 回答 3

7

eof()仅在尝试读取文件末尾时才会设置:您必须尝试至少读取一次。来自std::basic_ios::eof

此函数仅报告最近 I/O 操作设置的流状态,它不检查关联的数据源。例如,如果最近的 I/O 是 get(),它返回文件的最后一个字节,则 eof() 返回 false。下一个 get() 无法读取任何内容并设置 eofbit。只有这样 eof() 才会返回 true。

于 2012-09-04T13:38:26.420 回答
5

就像您将读取一个非空文件一样,您将读取操作作为循环的条件。代码应该是不言自明的:

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>>用来读取与 s 不同的内容std::string,则错误检查的逻辑会发生变化 - 循环可能结束并且 eof 尚未设置。(假设您在ints 中读取并且提取操作在此过程中遇到非数字)。您需要考虑到这一点。

于 2012-09-04T13:40:07.343 回答
-1
       ifstream fin("empty-file.txt");
       string line;
       while(true){
            fin>>line;
            if(fin.eof())break;
       }

我认为应该这样做。但是为什么要读取一个空文件呢?

于 2012-09-04T14:21:58.660 回答