读取某些文件时出现分段错误,似乎与文件大小无关
segmentation fault on reading certain files, seems to be unrelated to filesize
感谢您花时间帮助我解决这个问题。
所以我在C++中制作了一个基于终端的文件管理器,并添加了一个读取文件的功能。 这有效,但对于某些文件,它始终抛出段错误。 这总是一致地发生在相同的文件中,但我还没有找到模式。 我的朋友建议这可能是一个尾随的换行符,但我尝试删除它们,它们仍然触发了段错误。 我调试了,找出了导致它的行,并使用 valgrind 创建了一个内存日志,两者都将包括在内。
我所知道的:
-
如前所述,这似乎不是因为尾随换行
符 -
文件大小似乎并不重要,因为最后一次发生在 2 字节文件上。但也在更大的文件上。
瓦尔格林德输出
如果您需要其他任何东西,请随时询问! :)
void viewFile()
{
clear();
attron(A_STANDOUT);
mvaddstr(0, 0, std::string(COLS, ' ').c_str());
mvaddstr(0, 0, "File Contents:");
attroff(A_STANDOUT);
std::string filePath = getSelectedFile().c_str();
std::ifstream file(filePath); // this line throws a segfault on some files
std::string line;
int index = fileViewStart;
int lineNumber = 0;
while (std::getline(file, line))
{
lineNumber++;
if (index - fileViewScrollOffset >= fileViewStart && index - fileViewScrollOffset < fileViewEnd)
mvaddstr(index - fileViewScrollOffset, 0, (std::to_string(lineNumber) + std::string(fileViewMarginLeft, ' ') + line).c_str());
index++;
}
mvaddstr(LINES - 1, 0, "Continue [ENTER]");
isShowingOutput = true;
isViewingFile = true;
}
由于它在ifstream
构造函数上出错,并且您唯一的输入是文件名,这就是我首先要查找的地方。换句话说,请在尝试使用它之前打印出filePath
。
我的意思不一定只是std::cout << filePath << 'n'
(尽管这可能足以看出问题(。您可能需要输出长度和每个字节,以防一些奇怪的东西逃逸到其中:-(
看到您的valgrind
输出有很多警告,另一种可能性是您使用了内存中可能无效的值,即使存在编写良好的代码,这也肯定会导致问题:
Invalid read of size 1. Address 0x4f990e2 is 210 bytes inside a block of size 212 free'd.
Conditional jump or move depends on uninitialised value(s).
Use of uninitialised value of size 8.
Bad permissions for mapped region at address 0x48B2B30.
您可能还想更深入地研究这些问题。
相关文章:
- 读取某些文件时出现分段错误,似乎与文件大小无关
- 构建挂起,即使是适度的文件大小
- 如何在Windows内核中获取文件大小
- 为什么 QFileSystemWatcher 会发出多个信号?而 QFileInfo 首次写入零文件大小
- 使用 C++ iOS::ate 获取错误的文件大小
- 相同的源代码,不同的可执行文件大小?
- 为什么未关闭的文件大小为 4 字节
- cpp 在主源文件中包括.cpp文件导致错误"duplicate symbol"
- 从生成文件编译错误:"Unable to open output file" ..."No such file or directory"
- Reader类实现中的文件读取错误
- 代码作为 C 文件工作,但不作为C++文件,错误:'__builtin_types_compatible_p'未在此范围内声明
- 如何在不设置 ulimit -n 的情况下解决套接字程序打开太多文件的错误
- 错误的donwloaded文件大小在QT 5.6中
- VMR9 对捕获的文件施加错误的视频大小
- 是否存在fseek/ftell可能给出错误文件大小的情况
- gdb 7.0警告:核心文件中的fpregset大小错误
- 读取文件的大小错误
- 为什么stat()调用会返回一个错误的0(0)文件大小值?
- 从资源中提取文件,文件大小错误
- tellg()函数给出了错误的文件大小