1

我正在编写一个 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 读入一个数组。是否可以在这个循环中做到这一点,或者我必须保存将此放入一个文件并编写一个单独的部分以将文件的内容读入数组。我想知道是否有人可以提供帮助。

4

3 回答 3

5

您可以使用std::stringstreamstd::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());
于 2013-09-11T09:50:06.057 回答
3

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

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

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

于 2013-09-11T09:49:33.003 回答
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...
}

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

于 2013-09-11T10:22:59.283 回答