c++ 从txt文件阅读一行并捕获无效数字

ldioqlga  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(181)

假设我有一个.txt文件,如下所示:

1234,3345
1246,3837
1283,5555
12P4,5730

我将每一行都读作int,但是当读到像12P4这样的无效数字时,如何在不使程序崩溃的情况下捕获它,并将无效数字存储在列表中呢?
我可以一行一行地读取它,但是我不确定如何捕获无效数字并继续处理更多的行,捕获更多的无效数字(如果存在)。

ttcibm8c

ttcibm8c1#

步骤1:将文件中的每一行读入一个字符串。
第二步:检查由“数字逗号数字”组成的行。

std::string line;
while (std::getline(std::cin, line)) {
   // Read a line.
   std::stringstream   lineStream(line);
   int a, b;
   char x = 'X';

   if (lineStream >> a >> x >> b && x == ',') {
       // The line starts with number comma nummber
   }
   else {
       // There was a failure reading the numbers of commas
       // This will catch the 12P
}
gjmwrych

gjmwrych2#

我建议您使用std::getline在每个循环迭代中读取文件的一行,在每个循环迭代中,您调用std::string::findstd::string::substr将该行拆分为两个字符串,其中第一个字符串包含,之前的所有内容,第二个字符串包含,之后的所有内容。然后你可以使用函数std::stoi尝试将字符串转换为整数。如果这个函数失败,它将抛出一个异常。另外,使用中间的函数参数std::stoi,你可以检查整个字符串是否被转换。
下面是一个示例程序:

#include <iostream>
#include <fstream>
#include <string>
#include <stdexcept>

int main()
{
    std::ifstream input( "input.txt" );
    std::string line;

    while ( std::getline( input, line ) )
    {
        int num1, num2;

        //find delimiter
        std::string::size_type pos = line.find( ',' );
        if ( pos == std::string::npos )
        {
            std::cerr << "Warning: Skipping line due to splitting error!\n";
            continue;
        }

        //split line into two tokens
        std::string token1 = line.substr( 0, pos );
        std::string token2 = line.substr( pos + 1, std::string::npos );

        //attempt to convert both tokens to integers
        try
        {
            size_t chars_matched_1, chars_matched_2;

            num1 = std::stoi( token1, &chars_matched_1, 10 );
            num2 = std::stoi( token2, &chars_matched_2, 10 );

            if (
                chars_matched_1 != token1.length()
                ||
                chars_matched_2 != token2.length()
            )
            {
                std::cerr << "Warning: Skipping line due to only partial conversion!\n";
                continue;
            }
        }
        catch ( const std::invalid_argument& )
        {
            std::cerr << "Warning: Skipping line due to conversion error!\n";
            continue;
        }
        catch ( const std::out_of_range& )
        {
            std::cerr << "Warning: Skipping line due to out of range error!\n";
            continue;
        }

        std::cout << "Found line with " << num1 << " and " << num2 << ".\n";
    }
}

对于问题中指定的输入,此程序具有以下输出:
标准输出(std::cout):

Found line with 1234 and 3345.
Found line with 1246 and 3837.
Found line with 1283 and 5555.

标准误差(std::cerr):

Warning: Skipping line due to only partial conversion!

如您所见,检测到字符串"12P4"只能部分转换为整数,因此跳过了该行。

相关问题