我正在尝试编写一些代码来读取文件并提取它并将它们保存为变量。
以下是相关代码:
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 ::求得尝试得到一些工作,虽然很明显,一旦我尝试读取多行后就无法使用它。
任何帮助都将不胜感激。
答案 0 :(得分:3)
ifstream::get()
将尝试生成以空值终止的C字符串,但您没有提供足够的空间。
你可以:
char address[11];
(或更大)以保存长度超过9个字符的以空字符结尾的字符串。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;
答案 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}})。这可以防止主流
如果行中存在格式错误,则进入错误状态
它在这种情况下提供自动重新同步。