【问题标题】:How to read groups of integers from a file, line by line in C++如何在 C++ 中逐行从文件中读取整数组
【发布时间】:2010-02-18 08:15:35
【问题描述】:

我有一个文本文件,每一行都有一个或多个整数,用空格分隔。如何以优雅的方式使用 C++ 阅读此内容?如果我不关心我可以使用 cin >> 的行,但重要的是哪些行整数是。

示例输入:

1213 153 15 155
84 866 89 48
12
12 12 58
12

【问题讨论】:

  • 你是说你需要一次读一行吗?您需要知道换行符在哪里,而不仅仅是数字序列?
  • @Steve314 确实,我已经意识到我忘了提到这一点

标签: c++ input


【解决方案1】:

这取决于您是要逐行执行还是整套执行。将整个文件转换成整数向量:

int main() {
   std::vector<int> v( std::istream_iterator<int>(std::cin), 
                       std::istream_iterator<int>() );
}

如果您想按行处理:

int main()
{
   std::string line;
   std::vector< std::vector<int> > all_integers;
   while ( getline( std::cin, line ) ) {
      std::istringstream is( line );
      all_integers.push_back( 
            std::vector<int>( std::istream_iterator<int>(is),
                              std::istream_iterator<int>() ) );
   }
}

【讨论】:

  • 第二部分正是我需要的!感谢所有回答的人!
  • 我需要将 istream_iterator(is) 放入 '(' ')' 以避免语法歧义(显然它也可能与函数混淆,clang 警告我)。
  • @David Rodríguez - dribeas,谢谢。我不明白第二部分中一行的语法。 //std::vector( std::istream_iterator(is),std::istream_iterator() ),看来你在这里同时声明和初始化一个新向量,你能解释一下吗关于它的更多信息?特别是“std::istream_iterator()”?谢谢!
  • @ulyssis2:表达式中的语法T() 创建了一个T 类型的临时值,它是值初始化,类似的语法T(args) 创建一个临时值输入 T 初始化为 args。这是一种基本语法。在 S.O. 中有一个 C++ 推荐书籍列表。看看他们。
【解决方案2】:

你可以像这样做 smtng(我用的是 cin,但你可以使用任何其他文件流):

string line;
while( getline( cin, line ) )
{
 istringstream iss( line );
 int number;
 while( iss >> number )
  do_smtng_with_number();
}

或者:

int number;
while( cin >> number )
{
 do_smtng_with_number();
}

【讨论】:

    【解决方案3】:

    你想要什么结果?如果你想要一个向量中的所有整数,你可以这样做:

    std::ifstream input("input.txt");
    
    std::vector<int> data(std::istream_iterator<int>(input),
                          std::istream_iterator<int>());
    

    不过,这会丢弃行结构——你最终会得到所有数据。维护原始行结构的一种简单方法是使用 getline 读取一行,使用该字符串初始化一个字符串流,然后将该字符串流中的值放入一个向量中(并将其推到 int 向量向量的后面)。

    std::vector<std::vector<int> > data;
    std::vector<int> temp;
    
    std::string t;
    while (std::getline(input, t)) {
        std::istringstream in(t);
        std::copy(std::istream_iterator<int>(in), 
                  std::istream_iterator<int>(), 
                  std::back_inserter(temp);
        data.push_back(temp);
    }
    

    【讨论】:

      【解决方案4】:

      给你:

      void readFromFile(string filename)
      {
          string line;
          ifstream myfile(filename);
          if (myfile.is_open())
          {
               while ( getline(myfile,line) )
          {
              cout << line << '\n';
          }
              myfile.close();
        }
      }
      
      int main(int argc, char* argv)
      {
          readFromFile("Input.txt");
          getchar();
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 2022-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多