C++ 从Getline的字符缓冲区中分离EOF
我正在使用C++ 从Getline的字符缓冲区中分离EOF,c++,file-io,eof,C++,File Io,Eof,我正在使用getline从输入文件中提取缓冲区中的字符。在读完一行之后,我循环遍历所有字符,并在地图上进行查找(以便进行进一步的操作)。 问题是,一旦有效字符结束,我的程序就会从输入流中获取eof,并尝试在映射中查找它 我尝试检查inputStream.eof()或eofbit,以查看何时到达流的末尾,但问题是,在我完成最后的getline()时,这两个字符都会被设置,因此我无法使用它来确定eof字符在输入缓冲区中的位置 如何识别输入缓冲区中的EOF字符并避免在映射中查找它 while(file
getline
从输入文件中提取缓冲区中的字符。在读完一行之后,我循环遍历所有字符,并在地图上进行查找(以便进行进一步的操作)。
问题是,一旦有效字符结束,我的程序就会从输入流中获取eof,并尝试在映射中查找它
我尝试检查inputStream.eof()
或eofbit
,以查看何时到达流的末尾,但问题是,在我完成最后的getline()
时,这两个字符都会被设置,因此我无法使用它来确定eof字符在输入缓冲区中的位置
如何识别输入缓冲区中的EOF字符并避免在映射中查找它
while(fileInput) {
fileInput.getline(charBuf,charBufSize);
for(int i=0; i<=charBufSize ;i++) {
char* currentChar = &(charBuf[i]);
// do something with currentChar,
// which I proceed to do by dereferencing currentChar when I need to access
// the actual character.
}
}
while(文件输入){
getline(charBuf,charBufSize);
对于(int i=0;i,charBuf中没有“EOF字符”。即使在EOF字符作为概念存在的系统上(例如MS-DOS和Windows),istream::getline()也不会将其存储在charBuf中
发布的代码中的一个明显错误是循环中的越界访问:icharBuf中没有“EOF字符”。即使在EOF字符作为概念存在的系统上(例如MS-DOS和Windows),istream::getline()也不会将其存储在charBuf中
<> P>一个明显的错误是循环中的越界访问:<代码> i> P>没有C++中的EOF字符,您可以检查。您必须做的是读取和读取文件的字符数,以知道文件在哪里结束。您可以使用<代码> iSrAM::GCONTUTE()/<代码> < < /P>
您的代码中有几个问题
我想你已经申报了
char charBuf[256];
size_t charBufSize = 256;
第一个问题是您正在丢弃第一行输入。逐行读取文件的常用习惯用法是:
while( fileInput.getLine(charBuf, charBufSize) ) {
for (...) { // your for loop is wrong, but I'll get to that in a second
}
}
如果确实要在开始循环之前丢弃第一行,请使用
fileInput.getLine(charBuf, charBufSize); // this first line will be ignored
while( fileInput.getLine(charBuf, charBufSize) ) {
for (...) { // your for loop is wrong, but I'll get to that in a second
}
}
charBufSize包含可以读取的最大数据量,而不是实际读取的数据量。因此,如果只读取12个字符,则不仅要在字符13上执行映射查找,还要尝试处理字符14到256。为避免此情况,请将循环更改为:
for (int i=0; i < fileInput.gcount(); ++i ) {
char* currentChar = &(charBuf[i]);
// do something with currentChar,
// which I proceed to do by dereferencing currentChar when I need to access
// the actual character.
}
for(int i=0;i
<>你使用的是 >p>你没有可以检查C++中的EOF字符。你必须做的是得到一个字符数的计数,并用它来知道文件在哪里结束。你可以用<代码> iSrAM::GCONTUTE()/<代码>获得这个计数。
您的代码中有几个问题
我想你已经申报了
char charBuf[256];
size_t charBufSize = 256;
第一个问题是您正在丢弃第一行输入。逐行读取文件的常用习惯用法是:
while( fileInput.getLine(charBuf, charBufSize) ) {
for (...) { // your for loop is wrong, but I'll get to that in a second
}
}
如果确实要在开始循环之前丢弃第一行,请使用
fileInput.getLine(charBuf, charBufSize); // this first line will be ignored
while( fileInput.getLine(charBuf, charBufSize) ) {
for (...) { // your for loop is wrong, but I'll get to that in a second
}
}
charBufSize包含可以读取的最大数据量,而不是实际读取的数据量。因此,如果只读取12个字符,则不仅要在字符13上执行映射查找,还要尝试处理字符14到256。为避免此情况,请将循环更改为:
for (int i=0; i < fileInput.gcount(); ++i ) {
char* currentChar = &(charBuf[i]);
// do something with currentChar,
// which I proceed to do by dereferencing currentChar when I need to access
// the actual character.
}
for(int i=0;i
如果要逐行阅读,请使用标准的getline习惯用法:
std::string line;
while (std::getline(inputFile, line))
{
// process line
}
如果要读取未格式化(“二进制”)输入,请使用read
和gcount
:
std::array<char, 4096> buf;
std::streamsize n;
while (true)
{
inputFile.read(buf.data(), buf.size());
if ((n = inputFile.gcount()) == 0) { break; }
// process [buf, buf + n)
}
std::数组buf;
std::流大小n;
while(true)
{
read(buf.data(),buf.size());
如果((n=inputFile.gcount())==0){break;}
//过程[buf,buf+n)
}
如果要逐行阅读,请使用标准的getline习惯用法:
std::string line;
while (std::getline(inputFile, line))
{
// process line
}
如果要读取未格式化(“二进制”)输入,请使用read
和gcount
:
std::array<char, 4096> buf;
std::streamsize n;
while (true)
{
inputFile.read(buf.data(), buf.size());
if ((n = inputFile.gcount()) == 0) { break; }
// process [buf, buf + n)
}
std::数组buf;
std::流大小n;
while(true)
{
read(buf.data(),buf.size());
如果((n=inputFile.gcount())==0){break;}
//过程[buf,buf+n)
}
您似乎忽略了发布一些代码,这些代码显示了您存在的问题。当我发布代码时,人们会求助于“为什么发布这么多代码”,而我不是相反:)没有“eof字符”这样的东西(在某些上下文中,Windows中的子控件代码除外),这真的需要一些代码来说明你是如何解释这个概念的。@angry可能是重复的-我相信是的,因为你使用getline时没有检查它是否工作。这就是另一个问题-在尝试阅读之后检查eof,而不是之前。你似乎忽略了发布一些代码来说明你遇到的问题当我发布代码时,人们求助于“你为什么发布这么多代码”,而我却不这么认为:)没有“eof字符”这样的东西(在某些上下文中,除了Windows中的子控件代码),这确实需要一些代码来说明如何解释这个概念。可能是@angry的重复-我相信是的,因为您使用getline时没有检查它是否工作。这就是另一个问题-在尝试阅读之后检查eof,而不是之前。感谢您的信任投票和信息丰富的答案:)我现在理解了在所有有效字符结束后循环失败的原因是因为我循环到了buffersize的末尾,而不是实际读取的字符数,现在我使用gcount()似乎解决了这个问题(同样,循环正上方的@angryInsomniac:thegetline
命令读取fil的第一行)