【问题标题】:getLine() returns newline and no datagetLine() 返回换行符并且没有数据
【发布时间】:2018-10-05 23:39:20
【问题描述】:

我有以下代码:

    const char *fn = fileName.c_str();
    std::ifstream file (fn);
    std::vector<std::string> value(20000);
    int i = 0;
    while ( file.good() )
    {
        getline ( file, value[i] );
        i+=1;
        std::cout << value[i]<< std::endl;
        std::cout << i << std::endl;
    }

程序读取整个文件,我知道这是因为打印了正确数量的索引。但是没有数据,只是在每次打印“i”之前换行。这是我从 Windows 中的 excel 保存并在 Linux 中读取的文件 - 这是我的问题吗?我的数据怎么了?

【问题讨论】:

    标签: c++ file stream


    【解决方案1】:

    没有数据,只是在每次打印“i”之前换行。

    因为您在访问value[i] 之前增加了i

    增加i刚刚访问value[i]解决了丢失数据的问题。

    DEMO

    【讨论】:

    • 更准确地说,ivalue[i] 的写入和读取之间递增。 (将增量向上移动一行也应该修复输出,尽管代价是 value[0] 未被使用。)
    【解决方案2】:

    更好的文件读取方式:

    std::string text_line;
    std::vector<string> file_lines;
    while (std::getline(file, text_line))
    {
      file_lines.push_back(text_line);
    }
    

    虽然在速度方面不是最佳的,但它可以完成工作并且没有上限(除了您的程序允许的内存量)。

    【讨论】:

    • 谢谢,但是如何解决丢失数据的问题?
    【解决方案3】:

    编辑:

    抱歉,我只是在修复明显的逻辑错误。

    但是,这里是读取文件行的​​理想版本:

    #include <iostream>
    #include <fstream>
    #include <vector>
    
    int main() {
        std::ifstream file {"test.txt"};
        std::vector<std::string> values;
    
        std::string temp;
    
        while (getline(file, temp)) {
            values.push_back(temp);
        }
    
        for (int i = 0; i < values.size(); ++i) {
            std::cout << values[i] << '\n' << i << '\n';
        }
    }
    

    【讨论】:

    • 这不是你阅读文件的方式。你需要测试getline的返回值。
    • 试试while (getline(file, value[i]))
    • 那么为什么这个答案解决了丢失数据的问题,这不只是做同样事情的一种稍微干净的方法吗?
    猜你喜欢
    • 2022-11-11
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 2012-01-20
    • 2016-06-22
    • 2022-06-30
    • 1970-01-01
    • 2011-04-02
    相关资源
    最近更新 更多