0

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

以下是相关代码:

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::beg 只是为了尝试使某些工作正常进行,尽管很明显,一旦我尝试逐行阅读多行,那将无法使用。

任何帮助,将不胜感激。

4

3 回答 3

3

ifstream::get()将尝试生成一个以 null 结尾的 C 字符串,但您没有为其提供足够的空间。

您可以:

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

编辑:

如果您想要一个可以动态考虑行长的缓冲区,请std::getline使用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;
于 2013-04-28T16:09:52.853 回答
0

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

于 2013-04-28T16:07:33.647 回答
0

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

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

std::string address;
//  ...
tracefile >> std::setw( 10 ) >> address;

这避免了'\0'等的所有问题。

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

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

于 2013-04-28T16:20:19.430 回答