C ++ ifstream;每个'\ n'字符打印两次

时间:2014-03-05 09:37:07

标签: c++ newline ifstream

我创建了一个小程序,它通过索引来实现operator []来读取文件。 有代码:

#include <iostream>
#include <fstream>

using namespace std;

class Findexer
{
    ifstream* f;
public:
    Findexer(string s)
    {
        f = new ifstream(s, ios_base::in);
        if (!f->is_open())
            cout << "Can't open file: " << s;
    }
    ~Findexer()
    {
        delete f;
    }

    char operator[](size_t ind)
    {
        f->seekg(ind);
        return f->get();
    }

};

int main()
{
    Findexer f("file.cpp"); //file with this program; it is the same with any other file
    for (int i = 0; f[i] != EOF; ++i)
        cout << f[i];
}

它工作正常,只是它每次打印每个新行字符。 输出开始了:

#include <iostream>

#include <fstream>



using namespace std;



class Findexer

我不知道它为什么会发生,无法谷歌任何有用的东西。 :(请帮忙!

2 个答案:

答案 0 :(得分:1)

我猜你在windows中运行它并使用MSVS?

对于换行符的DOS / UNIX编码,很可能是一个问题。 在编辑器中检查显示控制字符如何在file.cpp中编码新行。在Linux系统上,您的代码运行正常并正确打印文件。

答案 1 :(得分:0)

与换行问题无关,但测试f[i] != EOF不正确。 f[i]返回char,但EOFint,可能超出char的范围,或者与真正的角色具有相同的值

实际上,如果您想明确区分EOF和有效字符,EOF 必须超出流读取操作返回的值的范围。

您完成此操作的方式:如果普通char未签名且EOF-1,那么EOF测试将永远不会成功。或者,如果简单char已签名且EOF-1,则它将匹配有效字符-1的EOF(由0x80表示)。< / p>

此外,正如Joachim Pileborg所指出的,EOF可能甚至不匹配std::char_traits:eof(虽然理智的实现可能会对两者使用相同的值)。

当人们尝试将getchar()的返回值与EOF进行比较时,也会在C中出现此问题。 C通过让getchar()返回范围int中的0-255来解决此问题(假设您使用8位字符),即使明文char已签名;而EOF通常是-1

要修复代码,您可能需要考虑类似的东西,或者只是恢复为函数而不是重载运算符,通过引用“返回”char,并使用其实际返回值来指示成功或失败,就像std::istream::get(char&)

NB。您不必使用newdelete,只需让ifstream f成为您班级的成员。