将字符串的一部分读取到整数数组

Read part of string to integer array

本文关键字:整数 数组 读取 一部分 字符串      更新时间:2023-10-16

我正在编写一个C++程序来操作文本文件。任务的一部分涉及在文本文件中搜索特定的"搜索字符串",并将其的一部分存储为整数数组。

我写了以下代码:

ifstream myoutfile;                      
myoutfile.open (outputfile.c_str());    // filename is passed as a user input
string search="SEARCH STRING"           // search string
while (getline(myoutfile, line))
{
     if (line.find(search) != string::npos)
     {
           cout << line[54] << line[55] << line[56] << endl;  
     }
}

问题是我想将行的第 54 个第 55 个和第 56 个字符作为单个整数读取到数组中。(假设第 54 个字符是"1",第 55 个字符是"2",第 56 个字符是"6"。我想将其作为数字 126 读入数组。是否可以在此循环中执行此操作,或者我必须将其保存到文件中,并编写一个单独的部分以将文件的内容读取到数组中。我想知道是否有人可以提供帮助。

您可以使用 std::stringstream 和 std::string::substr 来获取子字符串并转换为 int。也可以使用 std::atoi

#include <sstream>
int i = 0;
std::istringstream ss(line.substr(54, 3));
ss >> i;

#include <cstdlib>
int b = std::atoi(line.substr(54, 3).c_str());

如果只是 54 到 56 个字符,你可以这样做:

int x = (line[54] - '0') * 100 +(line[55] - '0') * 10 +(line[56] - '0') ;

line[54] - '0'部分将字符符号转换为数字。

这里的通常解决方案是 std::istringstream ,但它确实如此需要比其他海报似乎暗示的更多的工作:

std::istringstream parser( line.substr( 54, 3 ) );
parser >> i;
if ( !parser || parser.get() != EOF ) {
    //  Error.
} else {
    //  No error, you can use i...
}

如果你有C++11,你可以使用std::stoi,但乍一看,它似乎更复杂:

size_t end = 0;
try {
    i = std::stoi( line.substr( 54, 3 ), &end );
} catch ( std::runtime_error const& ) {
    //  No numeric characters present...
    //  end remains 0...
} 
if ( end != 3 ) {
    //  Error, either string wasn't long enough, or
    //  contained some non-numeric.
} else {
    //  No error, you can use i...
}

另一方面,通过捕捉std::invalide_argumentstd::out_of_range单独,您可以区分错误。

或者,当然,您可以直接使用strtol

char tmp1[4] = {};
line.copy( tmp1, 3, 54 );
char* end;
errno = 0;
long tmp2 = strtol( tmp1, &end, 10 );
if ( errno != 0 || end != tmp1 + 3 || tmp2 > INT_MAX || tmp2 < INT_MIN ) {
    //  Error...
} else {
    i = tmp2;
    //  No error, you can use i...
}

考虑到所有因素,我想我更喜欢第一种方法(但是最后一个可能会快得多)。