为什么 std::ifstream 会自行关闭?

Why is std::ifstream closing by itself?

我正在以这种方式读取 ascii 文件:name1|name2|name3|name4|name5|name6|name7||||||||||name8|||name9 它由一堆由“|”分隔的名称组成char,一些插槽是空的。我正在使用以下代码读取名称列表:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

int main() {
    std::ifstream File;
    File.open("File.txt");
    if (!File.is_open())
        return -1;

    std::vector<std::string> Names;
    char Buffer[0xff];
    while (!File.getline(Buffer,16,'|').eof()) {
        if (strlen(Buffer) == 0)
            break;
        Names.push_back(Buffer);

        std::cout << strerror(File.rdstate()) << std::endl;
    }

    return 0;
}

它正常工作,它每次都读取一个名称,但由于某种原因,如果它在 File.getline() 的第二个参数上命中字符计数并且找不到 分隔符 字符,它会自行关闭。这是我在 运行 一个大文件上的代码之后得到的控制台输出:

File: File.txt
Ana|Bjarne Stroustrup|Alex

Console:
No error
No such file or directory

它成功读取了列表中的第一个名字,但是当它尝试读取第二个名字时,它没有命中 delimiting 字符,并且由于某种原因它导致到文件自行关闭。我希望有人能向我解释为什么会这样。

您可以使用 below 显示的程序将 File.txt 中的姓名添加到 std::vector:

#include <iostream>
#include <vector>
#include <string>
#include <fstream>
int main()
{   
    std::ifstream inputFile("File.txt");
    
    std::string wordName;
    
    std::vector<std::string> Names;
    if(inputFile)
    {
        while(getline(inputFile, wordName, '|'))
        {
            if((wordName.size()!=0))
            {
                Names.push_back(wordName);
            }
        }
    }
    else 
    {
        std::cout<<"File could not be opened"<<std::endl;
    }
    
    inputFile.close();
    
    //lets check/confirm if our vector contains all the names correct names 
    for(const std::string &name: Names)
    {
        std::cout<<name<<std::endl;
    }
    return 0;
}

上面程序的输出可见here.

表达式strerror(File.rdstate())没有意义。表达式 File.rdstate() return 是一个整数,表示流的状态标志位。这不是错误代码。但是,函数 strerror 需要一个错误代码。

因此,通常调用strerror(errno)perror(nullptr)可能更有意义。但在这种情况下,两者都只是 return 或打印 "No Error".

在您的问题中,您写道:

It reads the first name on the list successfully, but when it tries to read the second name, it doesn't hit the delimiting char, and for some reason it leads to the file closing by itself. I hope someone can explain to me why does this happen.

文件没有关闭。错误信息

No such file or directory

您收到的信息具有误导性。这是您错误使用函数 strerror 的结果,如上所述。

如果getline 无法读取分隔字符,则会导致设置failbit。由于流处于失败状态,下一个循环迭代中 getline 的下一个函数调用会立即失败,而不会尝试提取任何字符。这会导致 if 语句

if (strlen(Buffer) == 0)

为真,导致循环中止。