ifstream分割故障
Ifstream segmentation fault
我有一个名为 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);
...
}
相关文章:
- 分割故障C++矩阵
- C ,二进制树的高度,而不是检查我的子树是否为空,而是在检查我的子树是否是叶子节点.抛出分割故障
- 我正在为此代码分割故障
- 在执行strcpy时获取分割故障错误
- 空隙指针分割故障
- Xcode会产生分割故障,而不是例外
- OPENCV C 中的分割故障误差
- 分割故障:核心倾倒C 矢量对字符串:
- C 2D数组导致分割故障(核心倾倒)
- 分割故障/错误读数变量-C 列表
- DLSYM导致分割故障
- 使用C 中的操作员删除的分割故障
- 使用Linux X64下的Libmozjs-52(SpidermonKey)进行分割故障
- 使用长变量时分割故障(11)错误
- C - 返回字符串时的分割故障
- 创建VertexArray时的分割故障
- 向量分割故障的向量
- 从std :: fileSystem ::路径对象的类中退出时的分割故障
- C 矢量分割故障
- 基于向量的数据格式的分割故障误差