我正在编写一个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'55th是'2'而第56个是'6'。我想将它作为数字126读入数组。是否可以在此循环内执行此操作,或者 我必须将其保存到一个文件中并编写一个单独的部分来将文件内容读入数组。我想知道是否有人可以提供帮助。
答案 0 :(得分:5)
您可以使用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());
答案 1 :(得分:3)
如果它只是54到56个字符,你可以做到:
int x = (line[54] - '0') * 100 +(line[55] - '0') * 10 +(line[56] - '0') ;
line[54] - '0'
部分将char符号编号转换为它的编号。
答案 2 :(得分: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_argument
和
std::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...
}
考虑到所有事情,我认为我更喜欢第一种方法(但是 最后的 可能会明显加快速度。)