C++ 有没有办法去掉istream get末尾的空字符?

C++ 有没有办法去掉istream get末尾的空字符?,c++,ifstream,C++,Ifstream,我目前正试图编写一段代码来读取文件,提取其中的一些内容,并将它们保存为变量 以下是相关代码: char address[10]; ifstream tracefile; tracefile.open ("trace.txt"); tracefile.seekg(2, ios::beg); tracefile.get(address, 10, ' '); cout << address; 我遇到的问题是,地址遗漏了最后一个“0”,因为它在那里放了一个/0字符,我不知道如何绕过它?因

我目前正试图编写一段代码来读取文件,提取其中的一些内容,并将它们保存为变量

以下是相关代码:

char address[10];

ifstream tracefile;
tracefile.open ("trace.txt");
tracefile.seekg(2, ios::beg);
tracefile.get(address, 10, ' ');
cout << address;
我遇到的问题是,地址遗漏了最后一个“0”,因为它在那里放了一个/0字符,我不知道如何绕过它?因此,它输出:

0x0000000
我也有一些问题

tracefile.seekg(2, ios::cur);
它似乎不起作用,因此我将它改为ios::Begg只是为了尝试让某些东西起作用,尽管很明显,一旦我尝试一行接一行地阅读多行内容,它就不可用了


如果有任何帮助,我们将不胜感激。

请将缓冲区变大,以便您可以读取整个输入文本,包括终止的
'\0'
。或者使用
std::string
,它没有预先确定的大小。

将缓冲区变大,这样您就可以将整个输入文本读取到其中,包括终止的
'\0'
。或者使用
std::string
,它没有预先确定的大小。

将尝试生成以null结尾的C字符串,但您没有为其提供足够的空间

您可以:

  • 分配
    字符地址[11](或更大)以保存长度超过9个字符的以空结尾的字符串
  • 改为使用不带空终止符的方式读取10个字节
  • 编辑:

    如果需要一个可以动态计算行长度的缓冲区,请与
    std::string
    一起使用

    std::string buffer;
    tracefile.seekg(2, ios::beg);
    std::getline( tracefile, buffer );
    
    编辑2

    如果只想读取到下一个空格,请使用:

    std::string buffer;
    tracefile.seekg(2, ios::beg);
    tracefile >> buffer;
    
    将尝试生成以null结尾的C字符串,但您没有为其提供足够的空间

    您可以:

  • 分配
    字符地址[11](或更大)以保存长度超过9个字符的以空结尾的字符串
  • 改为使用不带空终止符的方式读取10个字节
  • 编辑:

    如果需要一个可以动态计算行长度的缓冲区,请与
    std::string
    一起使用

    std::string buffer;
    tracefile.seekg(2, ios::beg);
    std::getline( tracefile, buffer );
    
    编辑2

    如果只想读取到下一个空格,请使用:

    std::string buffer;
    tracefile.seekg(2, ios::beg);
    tracefile >> buffer;
    

    您的代码有几个问题。首先是
    seekg(2,ios::beg)
    是未定义的行为,除非流 是以二进制模式打开的(您的不是)。它会起作用的 在Unix下,根据文件的内容 可以在Windows下工作(但也可以将您发送到 错误的地方)。在其他一些系统上,它可能是系统性的 失败,或者做任何其他事情。你不能可靠地寻找 指向文本流中的任意位置

    第二个是,如果你想准确地读10个字符, 您需要的函数是
    istream::read
    ,而不是
    istream::get
    。另一方面,如果你想读到 下一个空格,使用
    >
    到字符串中,效果最好。 如果要将提取的字符数限制为 最大值,在调用
    >
    之前设置宽度:

    std::string address;
    //  ...
    tracefile >> std::setw( 10 ) >> address;
    
    这避免了
    '\0'
    等的所有问题

    最后,当然,您需要进行错误检查。你应该 可能在执行任何操作之前检查打开是否成功 否则,您必须检查读取是否成功 在使用结果之前。(在编写代码时,如果 open由于任何原因都会失败,因为您有未定义的行为。)

    如果你读了多行,当然,最好的解决方案 通常是使用
    std::getline
    将每一行读入 字符串,然后解析该字符串(可能使用
    std::istringstream
    )。这可以防止主流从 如果行中存在格式错误,则输入错误状态,以及
    在这种情况下,它提供自动重新同步。

    您的代码有几个问题。首先是
    seekg(2,ios::beg)
    是未定义的行为,除非流 是以二进制模式打开的(您的不是)。它会起作用的 在Unix下,根据文件的内容 可以在Windows下工作(但也可以将您发送到 错误的地方)。在其他一些系统上,它可能是系统性的 失败,或者做任何其他事情。你不能可靠地寻找 指向文本流中的任意位置

    第二个是,如果你想准确地读10个字符, 您需要的函数是
    istream::read
    ,而不是
    istream::get
    。另一方面,如果你想读到 下一个空格,使用
    >
    到字符串中,效果最好。 如果要将提取的字符数限制为 最大值,在调用
    >
    之前设置宽度:

    std::string address;
    //  ...
    tracefile >> std::setw( 10 ) >> address;
    
    这避免了
    '\0'
    等的所有问题

    最后,当然,您需要进行错误检查。你应该 可能在执行任何操作之前检查打开是否成功 否则,您必须检查读取是否成功 在使用结果之前。(在编写代码时,如果 open由于任何原因都会失败,因为您有未定义的行为。)

    如果你读了多行,当然,最好的解决方案 通常是使用
    std::getline
    将每一行读入 字符串,然后解析该字符串(可能使用
    std::istringstream
    )。这可以防止主流从 如果行中存在格式错误,则输入错误状态,以及
    在这种情况下,它提供自动重新同步。

    使用拆分字符串如何?使数组大小为11使用拆分字符串如何?使数组大小为11谢谢,我确实这样做了,但是接下来我需要编写的代码中出现了一个问题,那就是将地址与数组中的一个条目进行比较(我正在编写缓存模拟器),因为会有一个我不想要的额外字符,我应该提到的是,在OP中,读入C样式的文本缓冲区会在输入的末尾放置一个
    '\0'
    。这就是C字符串的工作原理。如果你