我试图从文本文件中逐个字符地读取字符直到EOF,将它们放入字符数组中,以便我可以在之后操作它。用g ++编译没有错误,并且在运行时,我被提示输入文件,但它只是挂起。
int main (int argc, char *argv[]) {
string filename;
ifstream infile;
char *cp, c[1024];
memset (c, 0, sizeof(c));
cp = c;
cout << "Enter file name: " << endl;
cin >> filename;
//open file
infile.open( filename.c_str() );
//if file can't open
if(!infile) {
cerr << "Error: file could not be opened" << endl;
exit(1);
}
while (!infile.eof()); {
infile.get(c, sizeof(infile));
// get character from file and store in array c[]
}
}//end main
答案 0 :(得分:1)
您应该尝试使用istream::read()
方法,而不是get()
。这将有助于解决任何缓冲区溢出:
unsigned int chars_read = 0;
//...
// Read in the file.
if (!infile.read(c, sizeof(c))
{
// Handle the read error here.
// Also check for EOF here too.
}
// Obtain the number of characters actually read.
chars_read = infile.gcount();
答案 1 :(得分:0)
首先,您不想要测试eof()
!不知怎的,我开始觉得堂吉诃德找到了我的风车。但是,我知道您需要检查输入是否成功在尝试读取之后,因为在尝试读取流之前无法知道它是否会成功。
你的程序实际上并没有挂起!它只是等待您输入sizeof(infile)
个字符或结束输入(例如,在UNIX上使用Ctrl-D,在Windows上使用Ctrl-Z)。当然,这可能看起来像一个悬挂计划。您可以使用较小的尺寸(例如4
)来验证这确实是问题所在。当然,sizeof(infile)
几乎与一个小的随机数一样好:它是std::ifstream
类型的对象的大小,谁可以告诉它是什么?您可能打算使用sizeof(c)
来确保对get(c, n)
的调用不会写入超出c
的字符数。
答案 2 :(得分:0)
试试这个:
int cont = 0;
while(infile.good()) {
c[cont++] = infile.get();
}