首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++ 文件读取的一些有关问题

2013-04-26 
c++ 文件读取的一些问题问题:1:seekg的一个问题代码如下using namespace stdifstream inin.open(filenam

c++ 文件读取的一些问题
问题:1:seekg的一个问题
代码如下
using namespace std;
ifstream in;
in.open(filename,ios::in);
int order_count=0;
string order_sign="XXXXX";
string buffer;
vector<int> sign_pos;
int line_count=0;
bool good1=in.good();
bool eof1=in.eof();
while(getline(in,buffer))
{
if(buffer.size()>=(string::size_type)12)
{
buffer.resize(12);
if(buffer==order_sign)
{
order_count++;
sign_pos.push_back(line_count);
}
}
int nlength = in.tellg();
line_count++;
}
bool good2=in.good();
bool eof2=in.eof();
vector<Ind_Order> orders;
Ind_Order *one_order;
int nlength = in.tellg();
in.seekg(0,ios::beg);
nlength = in.tellg();
        while(getline(in,buffer))
{
            .......
        }

如上述代码所示,我想要第一遍读取文件确定标志字符串(sign_pos)的位置,之后使用seekg定位到文件开头,再读取一遍。
但是没有成功,第二次读取的循环while(getline(in,buffer))没有进入,目测是因为in.seekg(0,ios::beg);并没有成功定位到文件开头。
用nlength=in.tellg();看了一下,在in.seekg(0,ios::beg);前后nlength的值都是-1,可见是文件流出错了。
之后,在第一次读取前后加上了bool good1=in.good();bool eof1=in.eof();bool good2=in.good();bool eof2=in.eof();这样的代码。
调试结果表示,good1为true,eof1为false,good2为flase,eof2为true。
可见第一次读取完以后,in.good()就变成了false。

想问一下:
1)为什么读取完一次in.good()就变成了false。in.good()表示的是什么?in.tellg()=-1表示的是什么?是因为我读取的时候最后超出了流吗?(这个文件流怎么这么脆弱...怎么治他?)
2)in.seekg(0,ios::beg);为什么不成功。如何修改程序,可以成功实现我想要读取两次的目的。(最好不要是,关了文件重开一次这样的办法吧...)

问题2:ifstream in;in.getline(buffer,256,'\n');的一个问题。
我知道读取文件时,一次读取一行有一种方法,in.getline(buffer,a,'\n');但是这种方法在一行的字符数大于a时会出错。
具体而言,我试的结果是如果第一行的字符数大于a,那么第一次会读取a的字符存入buffer,之后每次buffer都是空的。用nlength=in.tellg();试了一下,在第一次读取后in.tellg()就变成-1了,文件流又出错了.......(怎么老是这个问题)
另一种读取一行的方法是getline(in,buffer),在任何情况下都可以把一行读完。但是不能限制读取长度。

那么有什么办法,能实现更好的in.getline的效果:即一次读取一行或限定长度a的字符,并且在一行字符数多于a时还不出错。



[解决办法]
可以用文件映射,然后用std::string::find
[解决办法]
不用C++,用C的文件IO反而更方便些
[解决办法]
摒弃fstream
使用FILE *

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose  //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
[解决办法]
good 代表
1)文件打开成功
2)文件操作(读写,定位)没有出错
3) 文件没有结束。
任何一个不对,good 变成false。
看来你确实需要执行in.clear();函数了!

热点排行