ifstream 在尝试读取前一个字符时卡在“\n”上

ifstream stuck on `\n` when trying to read the previous character

提问人:ahmed 提问时间:9/30/2023 最后编辑:ahmed 更新时间:9/30/2023 访问量:79

问:

我正在用 C++ 写一个脑解释器。它的语言功能之一是,在循环中,如果当前字节,则返回循环的开头,直到它是 .我的方法是逐个字符读取文件,而不是将整个文件加载到内存中。我习惯于回到上一个字符:!= 0== 0ifstream::seekg

[[nodiscard]] inline BFInstruction prev_inst()
{
    if (m_file.eof())
        m_file.clear(); // clear eof bit

    m_file.seekg(-2, std::ios::cur); // -1 is the current char so -2 for the previous

    return to_inst(static_cast<char>(m_file.get()));
}

在上一个字符与本例类似之前,一切都有效:\n

++++++[>++++++++<-
]>>++[>+++++<-]>[<<.+>>-]

m_file.get()当当前位置是行的开头时,总是返回,而不是在本例中返回。我该如何解决这个问题?\n-

更新

下面是一个可重现的示例:

main.cpp

#include <iostream>
#include <fstream>

char next(std::ifstream &f)
{
    char next;
    do
    {
        next = f.get();
    } while (next == '\n');

    return next;
}

char prev(std::ifstream &f)
{
    f.seekg(-2, f.cur);

    return f.get();
}

int main()
{
    std::ifstream f("../example.txt");

    std::cout << next(f) << '\n'; // `a`
    std::cout << next(f) << '\n'; // `b` (because \n is ignored)
    std::cout << prev(f) << '\n'; // '\n'
    std::cout << prev(f) << '\n'; // `\n` again no matter how many times
                                  // we call `prev()` when we would expect
                                  // `a` to be the previous char

    return 0;
}

example.txt

a
bc
C++ fstream 解释器 ifstream brainfuck

评论

3赞 Alan Birtles 9/30/2023
我猜您正在使用以文本模式打开的 Windows 行尾文件?在这种情况下,搜索是不可靠的。请举一个最小的可重复的例子
0赞 ahmed 9/30/2023
没错。我将行尾从 更改为 并且它起作用了,但我在不同的地方不断遇到相同的错误。我正在研究一个可重现的例子CRLFLF
0赞 Alan Birtles 9/30/2023
以二进制模式打开文件可能会解决您的部分或全部问题
0赞 ahmed 9/30/2023
会试一试
1赞 Paul Sanders 9/30/2023
以二进制模式打开文件可能会解决您的部分或全部问题但是,您的代码必须准备好显式处理 CRLF 行结尾。

答: 暂无答案