我创建了一个小程序,它通过索引来实现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
我不知道它为什么会发生,无法谷歌任何有用的东西。 :(请帮忙!
答案 0 :(得分:1)
我猜你在windows中运行它并使用MSVS?
对于换行符的DOS / UNIX编码,很可能是一个问题。 在编辑器中检查显示控制字符如何在file.cpp中编码新行。在Linux系统上,您的代码运行正常并正确打印文件。
答案 1 :(得分:0)
与换行问题无关,但测试f[i] != EOF
不正确。 f[i]
返回char
,但EOF
是int
,可能超出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。您不必使用new
和delete
,只需让ifstream f
成为您班级的成员。