gpt4 book ai didi

c++ - 从 Getline 的字符缓冲区中分离 EOF

转载 作者:行者123 更新时间:2023-11-27 23:26:51 25 4
gpt4 key购买 nike

我正在使用 getline从输入文件中获取缓冲区中的字符。读完一行后,我遍历所有字符并在 map 上查找(以进行一些进一步的操作)。问题是一旦有效字符结束,我的程序就会从输入流中获取 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.
}
}

最佳答案

C++ 中没有您可以检查的 EOF 字符。您需要做的是计算读入的字符数,并使用它来了解文件的结束位置。您可以使用 istream::gcount() 获取此计数.

您的代码中有几个问题。

我假设你已经声明了

char charBuf[256];
size_t charBufSize = 256;
  1. 第一个问题是您丢弃了第一行输入。逐行读取文件的常用习惯用法是:

    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
    }
    }
  2. charBufSize 包含可以读取的最大数据量,而不是实际读取的数据量。因此,如果您只读入 12 个字符,那么您不仅要对字符 13 执行 map 查找,而且还将尝试处理字符 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.
    }
  3. 您正在使用 <=而不是 < .我已经在上面的代码示例中修复了这个问题。

  4. 整个char* currentChar = &(charBuf[i]);事情有点不寻常。在我从你的问题中编辑出来的代码中(这样你问的基本输入问题会更清楚),你似乎正确地使用了它,但你似乎可以很容易地声明 char currentChar = charBuf[i];做了一些小改动以避免取消引用 currentChar在您使用它的地方。

关于c++ - 从 Getline 的字符缓冲区中分离 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8637194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com