任何方法摆脱istream结束时的空字符?

时间:2013-04-28 16:02:27

标签: c++ ifstream

我正在尝试编写一些代码来读取文件并提取它并将它们保存为变量。

以下是相关代码:

char address[10];

ifstream tracefile;
tracefile.open ("trace.txt");
tracefile.seekg(2, ios::beg);
tracefile.get(address, 10, ' ');
cout << address;

文件内容:(只是第一行)

R 0x00000000

我遇到的问题是地址错过了最后的'0',因为它在那里放了一个/ 0字符,而我不确定如何解决这个问题?所以输出:

0x0000000

我也遇到了

的问题
tracefile.seekg(2, ios::cur);

它似乎不起作用,因此为什么我把它改为ios ::求得尝试得到一些工作,虽然很明显,一旦我尝试读取多行后就无法使用它。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:3)

ifstream::get()将尝试生成以空值终止的C字符串,但您没有提供足够的空间。

你可以:

  1. 分配char address[11];(或更大)以保存长度超过9个字符的以空字符结尾的字符串。
  2. 使用ifstream::read()来读取没有空终止符的10个字节。
  3. 修改

    如果您想要一个可以动态计算该行长度的缓冲区,请将std::getlinestd::string一起使用。

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

    修改2

    如果您只想阅读下一个空格,请使用:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

第二个是如果你想要读出10个字符, 你需要的功能是istream::read,而不是istream::get >>。另一方面,如果你想阅读 使用>>到字符串中的下一个空格将最有效。 如果要将提取的字符数限制为a 最大值,在调用std::string address; // ... tracefile >> std::setw( 10 ) >> address; 之前设置宽度:

'\0'

这可以避免std::getline等所有问题。

最后,当然,您需要进行错误检查。你应该 在做任何事之前,可能会检查开放是否成功 否则,你一定要检查读取是否成功 在使用结果之前。 (正如你编写的代码,如果是 因任何原因打开失败,你有未定义的行为。)

如果您正在阅读多行,当然是最佳解决方案 通常使用std::istringstream将每行读入 字符串,然后解析该字符串(可能使用 {{1}})。这可以防止主流 如果行中存在格式错误,则进入错误状态 它在这种情况下提供自动重新同步。