繁体   English   中英

C ++ ifstream只读单词数

[英]C++ ifstream read only number of a word

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

file.txt:

hello 123-abc
world 456-def

当前代码:

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

现在,这显然不起作用,并且我一直试图解决“一会儿”,但我只是无法解决这个问题。

您可以通过多种方法来执行此操作。 您尝试过的方法不起作用,因为流中的读取位置没有类似数字的东西。 因此,输入将失败,并且将设置流的失败位 您将永远循环,因为您仅测试eof 阅读此以获得更多信息。

一种简单的方法是一次读取一行,并利用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并再次搜索。 它看起来像多项式搜索,但它是线性的。

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

现场示例在这里

解决此类问题的一种更灵活的方法是使用正则表达式。 在这种情况下,您只需要简单的数字正则表达式搜索即可。 以下内容只能找到正整数,但是您也可以使用这种类型的模式来查找复杂数据。 不要忘记包含标题<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 {};
}

现场示例在这里

您需要检查文件是否打开,然后获取当前行,然后解析该当前行以获取第一个数字:

std::string currentLine = "";
std::string numbers = "";
ifstream file("file.txt");
if(file.is_open())
{
    while(std::getline(file, currentLine))
    {
        int index = currentLine.find_first_of(' '); // look for the first space
        numbers = currentLine.substr(index + 1, xyz);
    }
} 

xyz是数字的长度(在这种情况下,如果始终为常数,则为3),也可以通过从(index, currentLine.back() - index);获取子字符串来查找下一个空格(index, currentLine.back() - index);

我相信你能弄清楚其余的一切,祝你好运。

逐行读取并删除所有非数字字符。 在推送到std::vector之前先完成一个std::stoi

std::ifstream file{"file.txt"};
std::vector<int> numbers;

for (std::string s; std::getline(file, s);) {
    s.erase(std::remove_if(std::begin(s), std::end(s),
        [] (char c) { return !::isdigit(c); }), std::end(s));
    numbers.push_back(std::stoi(s));
}

或者使用std::regex_replace删除非数字字符:

auto tmp = std::regex_replace(s, std::regex{R"raw([^\d]+(\d+).+)raw"}, "$1");
numbers.push_back(std::stoi(tmp));

现场例子

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM