简单的C++文件I/O问题

Simple C++ File I/O issue

本文关键字:问题 文件 C++ 简单      更新时间:2023-10-16

我已经有一段时间没有在C++中使用文件I/O了(通常只是C++),但我最近决定用它为朋友制作一个小型控制台项目。我的问题是,我在字符串数组和文件I/O方面遇到了一些问题(我不确定是哪个导致了问题)。我的代码如下(ReadPSWDS是一个ifstream):

                int i = 0;
            string str[200];
            ReadPSWDS.clear();
            ReadPSWDS.open("myPasswords.DoNotOpen");
            if(ReadPSWDS.is_open())
            {
                while(!ReadPSWDS.eof())
                {
                    getline(ReadPSWDS, str[i]); //Store the line
                    if(str[i].length()<1 || str[i] == "")
                    {
                        //Ignore the line if it's nothing
                    }
                    else
                    {
                        i++; //Move onto the next 'cell' in the array
                    }
                }
            }
            ReadPSWDS.close();

我的问题是,在测试这一点时,字符串数组将显示为空(在将所有这些行写入文件时,文件将如预期的那样为空)。为什么字符串数组是空的,而没有填充文本文件的相应行?

问候,

Joe

您编写的循环显然是错误的:您之前正在测试eof()失败,并且在getline之后不测试失败。C++I/O无法预测。(我不可能,因为无论你在eof()取决于你想读什么。)正确的模式是:

while ( i < size(str) && getline( readSWDS, str[i] ) ) {
    if ( !str[i].empty() ) {
        ++ i;
    }

请注意,我添加了一个针对i的测试。如所写,如果您的文件包含200多条线路,你就麻烦大了。

然而,我不确定这是否是你的问题;循环写它通常只会在最后一行引起问题。(通常,如果最后一行以'n'结尾,并且不为空,则将在您的数组中出现两次。)当然,除非你的文件包含200多行。

我可以补充一点,一个更典型的习惯用法是使strstd::vector<std::string>,并写入循环:

std::string line;
while ( std::getline( readSWDS, line ) ) {
    if ( !line.empty() ) {
        str.push_back(line);
    }
}

这避免了必须定义固定的最大行数。