【问题标题】:While not new line虽然不是新线
【发布时间】:2014-01-13 01:20:03
【问题描述】:

如果我有类似的文件

1 5 6 9 7 1 
2 5 4 3 8 9
3 4 3 2 1 6
4 1 3 6 5 4

我想对每一行中的数字进行排序.. 如何知道何时有换行符? 例如代码:

while (!input.eof) {
    input>>num;
    while (not new line ?){
    input>>o;
    b.push_back(o);
    }
    sort (b.begin(),b.end());
    se=b.size();
    output<<num<<" "<<b[se-1]<<endl;
    b.clear();
}

注意:我尝试了 while(input>>num) 并且 getline 现在可以与我一起使用 有什么想法吗?

【问题讨论】:

  • 如果您想阅读台词,最好的选择是getline。注意while (!eof()) is wrong.
  • 由于您似乎在逐个迭代每个字符,因此您可能会发现知道"\n" 是新行的CHAR 会很有帮助。
  • 为什么eof错了? Std::getline 本身确实将文件移到了末尾
  • @Gasim,点击 chris 提供的链接,看看为什么 while (!eof()) 是“错误的”。更具体地说,这不是检查这种循环的好方法,因为必须在 eof() 为真之前尝试读取 EOF。它不会告诉您您是否“处于”EOF。

标签: c++ file newline fstream


【解决方案1】:

您的输入无效!使用stream.eof() 的循环测试作为输入的唯一控制总是错误的。您总是需要在您尝试阅读您的输入之后对其进行测试。顺便说一句,我之前发布了如何保证对象之间没有换行符。已经有一个使用std::getline() 作为第一阶段的答案,这有点无聊。这是另一种方法:

std::istream& noeol(std::istream& in) {
    for (int c; (c = in.peek()) != std::char_traits<char>::eof()
             && std::isspace(c); in.get()) {
        if (c == '\n') {
            in.setstate(std::ios_base::failbit);
        }
    }
    return in;
}

// ...

while (input >> num) {
    do {
        b.push_back(num);
    } while (input >> noeol >> num);
    std::sort (b.begin(),b.end());
    se=b.size();
    output<<num<<" "<<b[se-1]<<endl;
    b.clear();
    input.clear();
}

【讨论】:

    【解决方案2】:

    您可以使用std::getline 和std::istringstream 来逐行读取文件,然后单独处理每一行:

    #include <sstream>
    std::string line;
    while (std::getline(infile, line))
    {
        std::istringstream iss(line);
        int a, b;
        //You can now read the numbers in the current line from iss
    } 
    

    有关如何逐行读取文件的进一步参考,请参阅this post。

    【讨论】:

      猜你喜欢
      • 2012-03-01
      • 2019-05-27
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多