C++ ifstream只读一个字的个数

标签 c++ fstream ifstream

所以我想从 .txt 文件中读取数字作为整数。

文件.txt:

hello 123-abc
world 456-def

当前代码:

int number;
ifstream file("file.txt");
while (!file.eof())
{
    file >> number; //123, 456
}

现在这显然行不通,我已经尝试解决这个“一段时间”,但我就是无法解决这个问题。

最佳答案

有多种方法可以做到这一点。您尝试过的方法不起作用,因为流中的读取位置没有类似数字的东西。因此输入将失败,流的失败位 将被设置。您将永远循环,因为您只测试 eofRead this获取更多信息。

一种简单的方法是一次读取一行,并利用 std::strtol 的第二个参数搜索第一个数字。 :

#include <iostream>
#include <string>
#include <experimental/optional>

std::experimental::optional<int> find_int_strtol( const std::string & s )
{
    for( const char *p = s.c_str(); *p != '\0'; p++ )
    {
        char *next;
        int value = std::strtol( p, &next, 10 );
        if( next != p ) {
            return value;
        }
    }
    return {};
}

int main()
{
    for( std::string line; std::getline( std::cin, line ); )
    {
        auto n = find_int_strtol( line );
        if( n )
        {
            std::cout << "Got " << n.value() << " in " << line << std::endl;
        }
    }
    return 0;
}

这有点笨拙,它还会检测底片,这可能是您不想要的。但这是一个简单的方法。 next指针将不同于 p如果提取了任何字符。否则函数失败。然后你递增 p 1 并再次搜索。它看起来像多项式搜索,但它是线性的。

我用过 std::optional来自 C++17,但我在 C++14 编译器上进行测试。是为了方便。您可以在没有它的情况下编写函数。

实例is here .

解决此类问题的一种更灵活的方法是使用正则表达式。在这种情况下,您只需要一个简单的数字正则表达式搜索。以下将仅查找正整数,但您也可以使用这种类型的模式来查找复杂数据。不要忘记包含标题 <regex> :

std::experimental::optional<int> find_int_regex( const std::string & s )
{
    static const std::regex r( "(\\d+)" );
    std::smatch match;
    if( std::regex_search( s.begin(), s.end(), match, r ) )
    {
        return std::stoi( match[1] );
    }
    return {};
}

实例 is here .

关于C++ ifstream只读一个字的个数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43904030/

相关文章:

c++ - C++中数组声明的一个问题

c++ - 使用标准输入重定向输入

c++ - 快速解析文件?

c++ - 无法让简单的 ifstream 在 Visual Studio Express 中工作

C++ 错误 : 'No suitable conversion from [class name] to "int"'

c++ - CheckRemoteDebuggerPresent 在 MingW 中不存在

c++ - 通过成员函数保持来自 fstream 的流打开

c++ - 将文本文件中的数据存储在结构数组 C++ 中

c++ - 为什么我使用 istream::get(char*, streamsize n, char delim) 会得到奇怪的结果?

c++ - 关闭 fstream 以便可以在代码中进一步编辑文件