【问题标题】:c++ ifstream, detect if letter or EOLine?c ++ ifstream,检测是字母还是EOLine?
【发布时间】:2009-01-25 09:30:37
【问题描述】:

我有这个函数可以从文件中读取所有整数。 问题是当我阅读字母时,我触发了一个新行,我总是按 1 而不是到行尾搜索。如何更好地编写这个函数?

int v;
    while (!in.eof())
    {
        while (in >> v)
            cout << v << " ";

        cout << endl;
        if (in.eof())
            break;
        in.clear();
        in.seekg(1, ios::cur);
        int a;
        a=0;
    }

【问题讨论】:

    标签: c++ ifstream eol


    【解决方案1】:

    如果您的文件仅包含由空格(包括)换行符分隔的整数,那么这就足够了。

    while( in >> v )
    {
        // do something with v
    }
    

    在文件之后,如果 in.fail() 为 false 且 in.eof() 为 true,则您到达文件末尾且没有格式错误。否则会发生读取 int 的错误。

    如果您收到无效输入并希望从中恢复,那么您需要确定您希望如何恢复。如果你想跳到行尾重新开始解析,你可以使用这样的东西。

    in.clear();
    in.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
    

    【讨论】:

      【解决方案2】:

      第一个问题,上面的代码没有停在行尾。
      运算符>>() 忽略包含换行符的“空白字符”。

      如何写得更好?
      如果不知道您要对数字做什么以及文件的输入格式是什么,这很难说清楚!

      但如果我写这个,我会不使用这些行来写它:

          if (in.eof())
                  break;
          in.clear();
          in.seekg(1, ios::cur);
      

      在处理格式化的文本文件时,很少看到使用 seek()。

      假设:
      文件只包含数字。
      您想将所有数字读入一个容器中。

      std::vector<int>    data;
      
      std::copy(  std::istream_iterator<int>(in),  // An iterator from current point
                  std::istream_iterator<int>(),    // To end of file.
                  std::inserter(data)              // Destination (insert into data)
               );
      

      【讨论】:

        猜你喜欢
        • 2017-02-27
        • 1970-01-01
        • 2011-09-01
        • 2013-08-05
        • 2012-12-23
        • 1970-01-01
        • 1970-01-01
        • 2011-04-15
        • 2013-11-06
        相关资源
        最近更新 更多