加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C++文件操作:控制文件读写位置

(2011-11-28 14:50:32)
标签:

c

文件

读写位置

杂谈

分类: 技术分享

         在做数学模型的一道题,需要处理大量的数据,我在用C++的文件处理的知识来处理这些数据,数据处理后要输出到文件,需要输出的文件有多项,片区名称area、片区地址address、片区人数num。由于片区名称和片区地址的字符串长度参差不齐,所以写入到文件后,格式很乱。

         可以应用c++的控制文件位置来格式化文件输出,在C语言中,有等效的fseek()函数,可以控制文件指针位置。

         和C的文件操作方式不同的是,C++ I/O系统管理两个与一个文件相联系的指针。一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。每次执行输入或输出时,相应的指针自动变化。所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是 seekg()和 seekp(),seekg()是设置读位置,seekp是设置写位置。它们最通用的形式如下:

istream &seekg(streamoff offset,seek_dir origin);

ostream &seekp(streamoff offset,seek_dir origin);

streamoff定义于 iostream.h 中,定义有偏移量 offset 所能取得的最大值,seek_dir 表示移动的基准位置,是一个有以下值的枚举:

ios::beg: 文件开头

ios::cur: 文件当前位置

ios::end: 文件结尾

这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。

例:

file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节

file2.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234个字节

 

下面是我第一次的程序有关写文件的操作:

string area,address;

int num;

ofstream outfile("output.txt");

outfile<<area<<"          "<<address<<"           "<<num<<endl;

下面是改进后的操作:

string area,address;

int num;

ofstream outfile("output.txt");

outfile<<area;

outfile.seekp(-strlen(area.c_str()) + 30,ios::cur);

outfile<<address;

outfile.seekp(-strlen(address.c_str()) + 30,ios::cur);

outfile<<num<<endl;

这里用strlen()函数就完美的解决了字符串长度参差不齐的问题。。。。

可以通过调用seekp()成员函数来指定逻辑指针到文件中的任一位置,seekp()成员函数通过指定的位置偏移量实现文件中重新定位。

在下面的范例中,程序定位到第10字节的文件位置,然后调用tellp()来输出新的位置: 

 ofstream fout("parts.txt"); 

fout.seekp(10); // move 10 bytes ahead from beginning 

cout<<"new position: "<<fout.tellp(); // display 10 

我在应用tellp成员函数读取文件指针时是这样用的:

ifstream infile("input.txt")

ofstream outfile("output.txt")

......

int temp=infile.tellp();

.......

infile.seekp(temp);

编译器会报错,提示tellp并不是std::ifstream的成员函数,把infile的定义类型改成fstream就行了,也就是:

fstream infile;

infile.open("input.txt");

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有