使用strtok()函数我没有什么问题.我正在解析两个文件.我将文件1加载到的第一个buffer.此文件包含我需要加载的第二个文件的名称.两个文件都是逐行读取的.我的代码看起来像这样:
char second_file_name[128] = { "" };
char * line = strtok( buffer, "\n" );
while( line != NULL )
{
if ( line[0] = 'f' )
{
sscanf( line, "%*s %s", &second_file_name );
LoadSecondFile( second_file_name );
}
// processing other lines, not relevant for question
line = strtok( NULL, "\n" );
}
Run Code Online (Sandbox Code Playgroud)
虽然该LoadSecondFile(...)功能以相同的方式工作,因此:
char * line = strtok( buffer, "\n" );
while( line != NULL )
{
// process file data
line = strtok( NULL, "\n" );
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,在调用该LoadSecondFile(...)函数之后,strtok()用于解析第一个文件的指针变得"混乱".而不是给我跟在第二个文件名称后面的行,它没有给我什么 - 理解为"完全废话".我是否认为这是由strtok()程序中的指针共享引起的,而不仅仅是在函数中?如果是这样,strtok()在使用它解析第二个文件之前,如何"备份" 用于解析第一个文件的指针?
谢谢你的建议.干杯.
strtok是一个维持全局状态的邪恶小函数,所以(正如你所发现的)你不能同时标记两个字符串.在某些平台上,有较少的邪恶变体,其名称如strtok_r或strtok_s; 但既然你在编写C++而不是C,为什么不使用C++库呢?
ifstream first_file(first_file_name); // no need to read into a buffer
string line;
while (getline(first_file, line)) {
if (!line.empty() && line[0] == 'f') { // NOT =
istringstream line_stream(line);
string second_file_name;
line_stream.ignore(' '); // skip first word ("%*s")
line_stream >> second_file_name; // read second word ("%s")
LoadSecondFile(second_file_name);
}
}
Run Code Online (Sandbox Code Playgroud)