C++ 调试器对ifstream数据的奇怪输出
我以只读模式打开文件,我读取了一行,但我无法理解调试器显示的行内容的含义:C++ 调试器对ifstream数据的奇怪输出,c++,debugging,fstream,remote-debugging,C++,Debugging,Fstream,Remote Debugging,我以只读模式打开文件,我读取了一行,但我无法理解调试器显示的行内容的含义: #include <cctype> #include <fstream> #include <iostream> #include <string> int main() { std::string fidMapPath = "./file.txt"; std::ifstream ifsFidMap(fidMapPath);
#include <cctype>
#include <fstream>
#include <iostream>
#include <string>
int main()
{
std::string fidMapPath = "./file.txt";
std::ifstream ifsFidMap(fidMapPath);
if(ifsFidMap.good() == false) {
std::cerr << "Error" << std::endl;
exit(1);
}
std::string line;
while(ifsFidMap.eof() == false)
{
std::getline(ifsFidMap, line);
std::cout << "Line: " << line << std::endl;
}
}
运行时,行
变量不打印任何内容;使用调试器,其内容在getline()
之前等于“”(空),在\\000\\000\\000\\000\\000…
之后等于“”,重复长度最多为2411个字符
这种行为的意义是什么
以下是我的平台详细信息:
- 操作系统:Windows 10,通过NetBeans 8.2在Linux(Red Hat,内核2.6.32-431.5.1.el6.x86_64)上远程构建
- 编译器:GCC4.8.2(C++11)
- 调试器:GDB Red Hat Enterprise Linux 7.6.1-47.el6
附言:正如建议的那样,我尝试在
while
参数中移动getline
:
while(std::getline(ifsFidMap, line))
但是我仍然有同样的问题。对于我使用的GCC版本4.8.2,我们必须使用
-std=C++11
编译器选项明确指定正在编译的是不是C++11代码。否则默认为C++98
这适用于高达5.x的GCC版本。请阅读
while(ifsFidMap.eof()==false){std::getline(ifsFidMap,line);…}
需要更改为while(std::getline(ifsFidMap,line)){…}
。至于调试器输出-在循环之前,行
字符串是完全空的,其内部缓冲区甚至还没有分配。调用getline()
后,字符串的缓冲区已分配,但它仍然是“空的”,因为其中没有存储任何数据。@RemyLebeau-谢谢。一个细节:调用getline()
后将空字符串表示为\\000\\000\\000\\000\\000…
是调试器的问题吗?@RemyLebeau-很抱歉我的回复太晚了。我只是尝试了你的建议,没有任何改进。我更新了我的问题。谢谢。@Pietro代码很好(使用我之前建议的更新;我还建议将if(ifsFidMap.good()==false)
更改为if(ifsFidMap.is_open()==false)
)。问题在于调试器本身。即使如此,调试器调用getline()
后如何显示字符串的内容与此有什么关系?无论使用C++版本是什么,所显示的代码都是相同的,因为它没有使用C++ 11或更高版本的任何特性。@ ReMyLeBeAu-我不知道,恐怕我没有时间深入研究。我注意到,编译代码的顺序是GCC的连续版本,我从构建成功的地方(GCC 5)开始,而当默认C++使用C++ 11时,这一点就发生了。
while(std::getline(ifsFidMap, line))