使用C++读取一行数字

5

如何标准地读取“数字行”并将这些数字存储在向量中是什么?

file.in
12 
12 9 8 17 101 2 

我应该逐行读取文件,将行用多个数字拆分,并将令牌存储在数组中吗?

我应该使用什么方法来完成这个任务?


如果你能保证它们是整数,那么你可以简单地读取它们并将它们存储到一个整数数组中(或者像vector这样的STL数据结构也可以),前提是你要解释一下如何使用你正在使用的分隔符进行解析。如果输出可能是其他类型,你可能需要将它们读入一个字符串中,并使用stringstream将它们转换为整数。 - RageD
3个回答

5
#include <vector>
#include <fstream>
#include <iterator>
#include <algorithm>

std::vector<int> data;
std::ifstream file("numbers.txt");
std::copy(std::istream_iterator<int>(file), std::istream_iterator<int>(), std::back_inserter(data));

4
这里有一个解决方案:
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>

int main()
{
    std::ifstream theStream("file.in"); 
    if( ! theStream )
          std::cerr << "file.in\n";
    while (true)
    {
        std::string line;
        std::getline(theStream, line);
        if (line.empty())
            break;
        std::istringstream myStream( line );
        std::istream_iterator<int> begin(myStream), eof;
        std::vector<int> numbers(begin, eof);
        // process line however you need
        std::copy(numbers.begin(), numbers.end(),
                  std::ostream_iterator<int>(std::cout, " "));
        std::cout << '\n';
    }
}

代码很漂亮!我已经测试过了,它可以工作,但我不理解其中一行(我是C++的新手),请问这一行做了什么?std::istream_iterator<int> begin(myStream), eof; begin和eof是两个迭代器吗?谢谢! - ulyssis2
@ulyssis2:是的,begin 是一个 istream_iterator,它将从 myStream 读取数据,而 eof 则是代表文件结尾的 istream_iterator - Howard Hinnant
非常感谢您回答我的问题。我有一个后续问题:由于 eof 只是声明而没有初始化,它如何表示文件的结尾? - ulyssis2
eof 被默认初始化。规范说明,一个默认初始化的 istream_iterator 表示流结束的迭代器。 - Howard Hinnant
@HowardHinnant 这个答案对我的项目非常有帮助 +1。只是想知道如何详细操作数字。例如,我不太确定如何从这个解决方案中访问第二行的第四个数字...或者文件中第m行的第n个数字。谢谢! - AngusTheMan

1
std::cin是做这个的最标准方式。std::cin会消除每个数字内部的所有空白字符,这样你就能顺利完成操作了。
while(cin << yourinput)yourvector.push_back(yourinput)

它们将自动插入向量 :)

编辑:

如果您想从文件中读取,可以将您的 std::cin 转换为自动从文件中读取:

freopen("file.in", "r", stdin)

你确定freopenstd::cin能很好地协同工作吗? - Evan Teran
我相当确定,因为到目前为止我没有收到任何错误消息...除了 freopen 在文件不存在时会抛出异常。 - ardiyu07
自从什么时候开始 freopen() 抛出异常了!? - André Caron
std::cin 不会消除空格,>> 运算符才能实现。伪代码是错误的(为什么不直接发布真正的代码呢?)。此外,重新打开标准输入并不是读取文件的好方法。只需使用 std::ifstream 即可,忘记 std::cin - Galik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接