【问题标题】:getline not saving all characters to stringgetline 没有将所有字符保存到字符串
【发布时间】:2018-11-19 02:00:05
【问题描述】:

以下程序将目录列表保存到文件中。然后读取该文件并询问用户文件夹名称是否为收藏夹。我的问题是,getline 函数不会将输入文件中的所有字符都保存到字符串中。 代码如下:

int main()
{
    fstream list;
    fstream favorites;

    string command1;
    string command2;
    string file;
    string file2;
    string line;

    // Cycle through the directories outputing the list of directories to a file

    for (int i = 0; i < 27; i++)
    {
        system("Y:");
        command2 = "dir Y:\\Blu-Rays\\";
        command2 += letters[i];
        command2 += "\\";
        command2 += " /b > Y:\\Blu-Rays\\";
        command2 += letters[i];
        command2 += "\\files.txt";
        cout << command2 << endl;
        system(command2.c_str());

        file = "Y:\\Blu-Rays\\";
        file += letters[i];
        file += "\\files.txt";
        list.open(file);

        file2 = "Y:\\Blu-Rays\\";
        file2 += "favorites.txt";
        favorites.open(file2);

        // The dir command also lists the file.txt in the file, open the file and erase the line
        while (getline(list, line))
        {
            // If the line file.txt is recognized, do not append the line to the file
            if (line != "file.txt")
            {
                list << line << endl;
                save(line);
                line = "";
            }
        }
    }

    list.close();
    favorites.close();

    return 0;
}

这是代码的输出:

dir Y:\Blu-Rays\#\ /b > Y:\Blu-Rays\#\files.txt
Current title: 2012
Do you want to save the title as a favorite? [y/n]: y
Current title: s to Kill
Do you want to save the title as a favorite? [y/n]: n
Current title: Rise of an Empire
Do you want to save the title as a favorite? [y/n]: n

输出的第 4 行应该是 3 Days to Kill,它读取 s to Kill。接下来,第五行应该是:300: Rise of the Empire 当它读作 Rise of an Empire

【问题讨论】:

  • 编辑您的问题以包含minimal reproducible example
  • 另外,英文字母表有 26 个字母,而不是 27 个。
  • 你正在写入你正在读取的同一个文件。
  • 为什么要使用system() 来枚举文件系统,而不是使用boost::filesystem 或Windows 上的File(First|Next)File() 等直接枚举文件系统中的文件自己的代码?那么你根本不需要输入文件,因为你已经在内存中拥有文件名了。

标签: c++ string getline


【解决方案1】:

同时从同一个 std::fstream 读取和写入可能不会达到您的预期。

更简单的解决方案是使用boost::filesystemstd::filesystem 遍历文件:http://en.cppreference.com/w/cpp/experimental/fs

for(auto& path: fs::directory_iterator("y:\\blurays\\"))
        std::cout << path << '\n';

【讨论】:

    猜你喜欢
    • 2014-10-04
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2011-03-05
    • 2016-10-22
    • 1970-01-01
    • 2016-01-02
    相关资源
    最近更新 更多