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))