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个字符的以空结尾的字符串
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个字符的以空结尾的字符串
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字符串的工作原理。如果你