ifstream分割故障

Ifstream segmentation fault

本文关键字:故障 分割 ifstream      更新时间:2023-10-16

我有一个名为 actions的字符串,其中有多个文件名,空格和这些文件名称之间的线路断开,例如:

File1 File2 File3 File4
File5 File6 File7 File8

我想一个接一个地打开文件,因此我将字符串划分为空格以单独获取文件名。

std::stringstream ss(actions);
std::string newline;
while(std::getline(ss, newline, 'n')){
    std::stringstream s1(newline);
    std::string espacos;
    std::getline(s1,espacos,' ');
    char* file = &espacos[0u];
    cout << file << 'n';
    ifstream ficheiro;
    ficheiro.open(file);
    ....
}

这是我分裂的地方。

字符串espacos是通过一个一个一个一个一个一个一个。

我正在从string转换为char*,但最终我得到了一个分段故障。

我使用了一个调试器,它说这条线导致了分段故障:

ficheiro.open(file);

所以我打印char* file以检查一切都还好,我得到了此输出:

File1
File2
File3
File4

由于文件名的一切都可以,而且我可以打开除File4以外的每个文件,您认为是什么引起此错误?

ps:我要在每个循环后关闭文件。

我可以看到Segfault显示的代码的唯一方法是file没有指向有效的null终止c-style字符串。

如果:

可能会发生
  • 您的STL的std::string实现不使用顺序存储器块来保持单个字符。

  • 您的STL的std::string实现确实使用了顺序存储器块,但不会终止该内存块。

无论哪种方式,都会导致&espacos[0u]产生不是有效的null终止的C风格字符串的指针。大多数STL实现确实使用顺序终止的内存块(因为它简化了实现(,但是直到C 11执行此类实现之前,这是不保证的。

无论如何,您不应该使用&espacos[0u]开始。您应该改用espacos.c_str(),在所有C 版本中保证,将指针返回到零端的C风格字符串:

const char* file = espacos.c_str();

话虽如此, operator>>默认情况下将流在空间上分配,因此您可以大大简化代码:

std::istringstream iss(actions);
std::string espacos;
while (iss >> espacos) {
    cout << espacos << 'n';
    ifstream ficheiro(espacos.c_str());
    // or, in C++11 and later:
    // ifstream ficheiro(espacos);
    ...
}