从包含混合整数、字母和空格的文件中读取整数 C++

Posted

技术标签:

【中文标题】从包含混合整数、字母和空格的文件中读取整数 C++【英文标题】:Reading integers from a file with mixed integers, letters, and spaces C++ 【发布时间】:2014-10-01 21:51:18 【问题描述】:

这是一种自我强加的额外学分问题,我要添加到我提前一周完成的当前编程任务中。分配涉及从文件中读取整数,每行有多个整数,每个整数用空格分隔。这很容易使用while(inFile >> val) 实现。

我面临的挑战是尝试从混合数字和字母的文件中读取整数,将所有连续数字作为由这些数字组成的单独整数提取出来。例如,如果我从文本文件中读取以下行:

12f 356 48 r56 fs6879 57g 132e efw ddf312 323f

读取(和存储)的值是

12f 356 48 r56 fs6879 57 g 132e efw ddf312 323f

12、356、48、56、6879、57、132、312 和 323

我整个下午都在挖掘 cplusplus.com 并阅读封面以涵盖 get、getline、cin 等的细节,但我无法找到一个优雅的解决方案。我可以推断出的每一种方法都涉及从整个文件中详尽地读取每个字符并将其存储到某种容器中,然后一次遍历一个元素并提取每个数字。

我的问题是在从文件中读取它们的过程中是否有办法做到这一点;即 get、getline、cin 和 company 的功能是否支持这种复杂的操作?

【问题讨论】:

相关:***.com/questions/24504582/… 【参考方案1】:

一次读取一个字符并检查它。有一个变量来维护当前正在读取的数字,还有一个标志告诉你是否正在处理一个数字。

如果当前字符是数字,则将当前数字乘以 10 并将数字添加到数字(并设置“处理数字”标志)。

如果当前字符不是数字,并且您正在处理一个数字,那么您已经到达数字的末尾,应该将其添加到您的输出中。

这是一个简单的实现:

std::vector<int> read_integers(std::istream & input)

    std::vector<int> numbers;

    int number = 0;
    bool have_number = false;

    char c;

    // Loop until reading fails.
    while (input.get(c)) 
        if (c >= '0' && c <= '9') 
            // We have a digit.
            have_number = true;

            // Add the digit to the right of our number.  (No overflow check here!)
            number = number * 10 + (c - '0');
         else if (have_number) 
            // It wasn't a digit and we started on a number, so we hit the end of it.
            numbers.push_back(number);
            have_number = false;
            number = 0;
        
    

    // Make sure if we ended with a number that we return it, too.
    if (have_number)  numbers.push_back(number); 

    return numbers;

(See a live demo.)

现在您可以执行以下操作从标准输入中读取所有整数:

std::vector<int> numbers = read_integers(std::cin);

这同样适用于std::ifstream

您可以考虑将函数设为模板,其中参数指定要使用的数字类型——如果您知道文件将包含无法放入 int 的大量数字。

【讨论】:

效果很好,谢谢!到目前为止,我的老师一直不鼓励我们使用向量,所以我没有想到要尝试。 @user3776749 “我的老师不鼓励我们使用向量”——让我们祈祷这很快就会结束。除了std::basic_string 可能的例外,您将很难找到比std::vector&lt;&gt; 更常被C++ 工程师使用的标准库模板。 (顺便说一句,答案+1)。 @user3776749 Np。请注意更新后的答案,它使用input.get(c) 而不是input &gt;&gt; c。输入流上char&gt;&gt; 运算符将跳过空白字符,这不是您想要的。

以上是关于从包含混合整数、字母和空格的文件中读取整数 C++的主要内容,如果未能解决你的问题,请参考以下文章

使用流在 C++ 中读取可变长度输入

如何在 C++ 中使用输入重定向添加整数

从文本文件中打印字符串和整数 (C++)

将文件中的间隔整数读入 C++ 中的数组

从文件中读取 64 位整数字符串

从 excel/文本文件中读取而不跳过空格,除非由选项卡制作