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

标签 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" );
}

虽然 LoadSecondFile(...) 函数以完全相同的方式工作,因此:

char * line = strtok( buffer, "\n" );
while( line != NULL )
{
  // process file data
  line = strtok( NULL, "\n" );
}

我的问题是,在调用 LoadSecondFile(...) 函数后,用于解析第一个文件的 strtok() 指针变得“困惑”。它没有给我第二个文件名称后面的行,而是什么也没给我——理解为“完全是胡说八道”。我是否理解这是由 strtok() 指针在程序中共享引起的,而不仅仅是在函数中?如果是这样,我如何在使用它解析第二个文件之前“备份”用于解析第一个文件的 strtok() 指针?

感谢您的任何建议。 干杯。

最佳答案

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);
    }
}

关于C++ strtok - 多次使用更多数据缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18379305/

相关文章:

c - 使用 fgets 和 strtok 读取 C 中的文件?

c - 用strtok拆分字符串然后保存错误

c++ - 有没有办法恢复嵌入在 boost mpl 引用中的原始模板模板类?

c++ - Qt4 Wrapper 导致段错误

c++ - 拦截windows打开的文件

c - 带有多个定界符的 strtok

c - strtok() 在应该有剩余的标记时返回 NULL

c - 为什么 strtok 会这样改变它的输入?

c++ - std::optional 的 const_cast 等价物

c++ - 从三个 3D 点计算变换矩阵