我对使用 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" );
}
虽然 LoadSecondFile(...)
函数以完全相同的方式工作,因此:
char * line = strtok( buffer, "\n" );
while( line != NULL )
{
// process file data
line = strtok( NULL, "\n" );
}
我的问题是,在调用 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);
}
}
关于C++ strtok - 多次使用更多数据缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18379305/