C++ strtok - 多次使用更多数据缓冲区

Hon*_*rík 1 c++ strtok

使用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()在使用它解析第二个文件之前,如何"备份" 用于解析第一个文件的指针?

谢谢你的建议.干杯.

Mik*_*our 7

strtok是一个维持全局状态的邪恶小函数,所以(正如你所发现的)你不能同时标记两个字符串.在某些平台上,有较少的邪恶变体,其名称如strtok_rstrtok_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)