关于助教在上课的时候用于读取文件内容的getLine方法,
在今天经过一个小程序试验得到这样的结果,
但是至今不懂得为什么,先记录下来之后再去找答案
1.读取文件test中行的内容,代码是下所示
#include <iostream>
#include<fstream>
using namespace std;
int main(){
char name[]="test.txt";
fstream fs(name,ios::in);
char content[10];
if(fs.is_open()){
while(!fs.eof()){//此处为错误
fs.getline(content,10);
cout<<content<<endl;
}
}
return 0;
}
而test.txt中的内容为
1234567
12345678902345
1234567
123456667666666666666
1231111111111111111111
!!!!!!!!!!!!!!问题:
其中内容从第2行开始就超过了10个字符的长度,然后从读取完第二次后,发现进行读取时,content中的内容没有变化,也就是说读取失败?这是为什么?而且这样while循环条件 !fs.eof()一直是成立的,为什么?
2.下面是同一个程序,将content的长度改变,getLine()方法的参数也改变成25,代码如下
#include <iostream>
#include<fstream>
using namespace std;
int main(){
char name[]="test.txt";
fstream fs(name,ios::in);
char content[25];
if(fs.is_open()){
while(!fs.eof()){
fs.getline(content,25);
cout<<content<<endl;
}
}
return 0;
}
结果:
此处content内容能够正确打印,且正确退出循环
3.在写一个小程序的时候还出现过这个问题:后面发现char content[20],而fs.getLine(content,30);然后出现了这个...后面想想个那个函数的调用压栈有关系吧,就是可能把返回地址给覆盖了?【好吧,真的不懂。。。以后过来修改解释】
总结:
虽然还是有问题不会,但是还是有些收获的。
在使用fstream的getLine()方法时,参数一定要大于一行储存的最长字符长度,否则会失败;若是getLine的参数大于字符个数,那么程序运行读取content完毕后,会在数组的末尾自动加上'\0';而且根据助教的写法,while成立的条件为fs.getLine(content,25),感觉起来安全很多,至少不会因为读取一次错误造成一直在循环...
ps:要是哪位看到了这个,能够解释我的疑问的话,欢迎指教。。。3Q