比较两个文件知道分段错误发生在哪里
Knowing where is the segmentation fault happening comparing two files
我有以下结构:
int main(int argc, char **argv) {
try {
FX3USBConnection fx3USB3Connection = FX3USB3Connection();
fx3USB3Connection.send_text_file();
}
catch (ErrorOpeningLib& e) {
printf("Error opening library\n");
return -1;
}
catch (NoDeviceFound& e) {
printf("No device found\n");
return 0;
}
return 0;
}
在 send_text_files 内,我做的最后一件事是比较两个 txt 文件,如下所示:
printf("Loopback recieved, checking if I received the same that I sended\n");
files_match(out_text_filename, in_text_filename);
printf("Exited without problem");
return; // (actually implicit)
我已经使用了 2 个版本的 files_match
函数,但最后一个是此 Compare two files
的精确副本
bool FX3USB3Connection::files_match(const std::string &p1, const std::string &p2) {
bool files_match;
std::ifstream f1(p1, std::ifstream::binary|std::ifstream::ate);
std::ifstream f2(p2, std::ifstream::binary|std::ifstream::ate);
if (f1.fail() || f2.fail()) {
return false; //file problem
}
if (f1.tellg() != f2.tellg()) {
return false; //size mismatch
}
//seek back to beginning and use std::equal to compare contents
f1.seekg(0, std::ifstream::beg);
f2.seekg(0, std::ifstream::beg);
files_match = std::equal(std::istreambuf_iterator<char>(f1.rdbuf()),
std::istreambuf_iterator<char>(),
std::istreambuf_iterator<char>(f2.rdbuf()));
f1.close();
f2.close();
if (files_match) { printf("Files match\n"); }
else { printf("Files not equal\n"); }
return files_match;
}
有时会出错,有时不会。当我收到错误时,我得到:
Loopback recieved, checking if I received the same that I sended
Files match
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
因此,调用 files_match
后的打印未打印,所以我猜问题出在函数内。但是,我在 return 语句之前进行了打印,并且打印正确。
PS:我评论了函数files_match
,没有问题。
PS1: 文件可以有这样的字符:¥
是的,正如@john 所建议的,我必须添加 fflush() 函数。在那里我意识到错误实际上是在所有这个循环之外,但实际上是在离开 try{} 部分时。对我来说,它并没有设法破坏 fx3USBConnection。
谢谢!现在我知道 fprint 实际上被缓冲了,所以我被误导了。
我有以下结构:
int main(int argc, char **argv) {
try {
FX3USBConnection fx3USB3Connection = FX3USB3Connection();
fx3USB3Connection.send_text_file();
}
catch (ErrorOpeningLib& e) {
printf("Error opening library\n");
return -1;
}
catch (NoDeviceFound& e) {
printf("No device found\n");
return 0;
}
return 0;
}
在 send_text_files 内,我做的最后一件事是比较两个 txt 文件,如下所示:
printf("Loopback recieved, checking if I received the same that I sended\n");
files_match(out_text_filename, in_text_filename);
printf("Exited without problem");
return; // (actually implicit)
我已经使用了 2 个版本的 files_match
函数,但最后一个是此 Compare two files
bool FX3USB3Connection::files_match(const std::string &p1, const std::string &p2) {
bool files_match;
std::ifstream f1(p1, std::ifstream::binary|std::ifstream::ate);
std::ifstream f2(p2, std::ifstream::binary|std::ifstream::ate);
if (f1.fail() || f2.fail()) {
return false; //file problem
}
if (f1.tellg() != f2.tellg()) {
return false; //size mismatch
}
//seek back to beginning and use std::equal to compare contents
f1.seekg(0, std::ifstream::beg);
f2.seekg(0, std::ifstream::beg);
files_match = std::equal(std::istreambuf_iterator<char>(f1.rdbuf()),
std::istreambuf_iterator<char>(),
std::istreambuf_iterator<char>(f2.rdbuf()));
f1.close();
f2.close();
if (files_match) { printf("Files match\n"); }
else { printf("Files not equal\n"); }
return files_match;
}
有时会出错,有时不会。当我收到错误时,我得到:
Loopback recieved, checking if I received the same that I sended
Files match
Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
因此,调用 files_match
后的打印未打印,所以我猜问题出在函数内。但是,我在 return 语句之前进行了打印,并且打印正确。
PS:我评论了函数files_match
,没有问题。
PS1: 文件可以有这样的字符:¥
是的,正如@john 所建议的,我必须添加 fflush() 函数。在那里我意识到错误实际上是在所有这个循环之外,但实际上是在离开 try{} 部分时。对我来说,它并没有设法破坏 fx3USBConnection。
谢谢!现在我知道 fprint 实际上被缓冲了,所以我被误导了。