【C++】关于seekg()在以文本模式打开文件时的问题

来源:百度知道 编辑:UC知道 时间:2024/04/29 23:16:09
//以下是我编的一个小程序,它的目的是自动统计123.txt中所有的int数量size,然后建立一个大小正好合适的数组保存那些整数,最后在将数组中整数输出到屏幕上。

#include<iostream>
#include<fstream>
using namespace std;

int main()
{
int p;
int size=0;

ifstream in("123.txt");

do{
in>>p;
size++;
}while(!in.eof());//此处可以统计出size的大小,而且是正确的

in.seekg(0);//BUG!无法将输出指针的位置移动到文件的开头
int a[size];
for(int i=0;i<size;i++)in>>a[i];//保存入数组a[size]都是些垃圾数据
in.close();

for(int i=0;i<size;i++)
cout<<a[i]<<endl;

system("Pause");
return 0;
}

请您提供一个思路可以将文件的输入指针再次移动到文件的开头,然后,可以正常读取数据进入数组。(限制条件:请不要再次使用ifstream XXX("123.txt"); 这个语句,我不希望重新打开一次文件123.txt -_- )
谢谢啦。

PS:如果,你可以编出一个效率更好,不使用STL也能实现上述目的的程序。我将不胜感激,并会尽可能的为您加分。
谢谢~
$$$
tanyuguo你好,为什么size一定要是常量呢?

我想了个办法,加上了一句in.clear();把I/O错误的标记符给去
掉啦。然后就可以正常输出了。

这应该是因为读到了文件结束符导致文件操作fail,是一个C++文件处理的典型错误,就是eof函数是在读到文件结束符后才会返回真,因此,在读完整数数据后,in.eof返回还是假,会继续读一次,读取了文件结束符.

处理这种错误,我会知道字符型数据的方法,整数我就不知道了.

当然,你的程序本身也有错误.
int a[size]不能这么声明,size不是常量 .
建议你声明一个足够大的数组,然后在第一次扫描文件时,就把数据读到a里面.毕竟,当今计算机的内存那么大,不在乎浪费那几K的字节.

数组的声明规定了大小要用常量,因为其大小在编译时就要确定,而变量的值要到运行时才知道.
为什么会I/O错误我也不知道,我认为应该是读取文件结束符后再读才会错误的.

我刚才在网上查了一下,文件操作fail后标准的处理方法就是clear一下.

使用ifstream的时候,可以用seekg进行重定位,但有一个需要注意的地方。如果想重定位到文件头,应该用: mFile.seekg(0, ios_base::beg);而不是 mFile.seekg(ios_base::beg);我实验的结果是,后者会定位到文件头后面一个字符,也就是说,第一个字符被吃掉了。我要记得,每一个指针在申明d时候就必须要初始化啊初始化,调试了1个工作日.读日志文件的一个类

fopen
读一行, 到eof为止
去掉\r \n
去掉前后空格
判断字符是否为数字
add到链表.你爱用stl也行, 自己写链表也行, 反正要一个能自动管理内存的容器,

fclose

循环链表元素, 累加