文件指针操作总结

来源:互联网 发布:php网页制作软件 编辑:程序博客网 时间:2024/05/17 09:03

最近自己在做数据结构结课设计,其中一项用到文件操作,需要把文件中的某一个字符更改,遇到点问题(见http://topic.csdn.net/u/20100701/23/61cdb1db-c248-4d63-a1c3-c4f9f82ed9c6.html)。非常感谢大家的热心帮助。

然后自己又进行了测试和查找图书,在此总结一下,希望能够帮助那些和我一样刚刚接触文件的朋友。

1、ios::out  该流式标志,会删除文件当前的所有内容,然后从新写入。

2、ios::app 会在文件末尾进行数据追加,它会使seekp()定位,然后替换字符这一方法失效,会直接向文件末尾写入。

3、课本(面向对象程序设计,清华大学版)上面说只有二进制文件才同时支持输入、输出操作,即(ios::in|ios::out|ios::binary)

但是,我再vs2010里面和vc6.0里面发现都可使用ios::in|ios::out,即使不用加ios::bianry.(这点只是例子,不知道真正的规则是什么,但是可知我们的课本,也不可全信)

4、向文件里写入信息,又不想删除以前的信息,还想能修改某处的字符,可以采用ios::ate|ios::in.

如果替换的字符比原字符长,就会覆盖掉原子符后面的信息

5、ios::ate  ,把所有新数据写入到文件的尾部,但同时如果程序移动了文件指针,就把数据输入到当前位置。

6、tellp()文件对象函数,可以显示当前文件指针的位置。

seekp(),可以把文件指针定向到偶一特定位置。

7、根据测试可知,文件指针是从零开始,以字节为单位,增1来标记的。

下面是我测试的代码,大家可以进行修改测试,本来还想来张图片,bmp格式不支持:

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
 char ss;
 string str("This is a test");
 ofstream outfile("data.txt",ios::ate|ios::in);
 if(!outfile)
 {cerr<<"open file error";
 exit(0);}
   for(int x=0;x<14;x++)
   {
    cout<<"file pointer:"<<outfilee.tellp();
    outfile.put(str[x]);
    cout<<"  "<<str[x]<<endl;
   }
   outfile.seekp(10);
   outfile<<"xxxx";
 outfile.close();
 return 0;
}

 

8、判断文件结尾函数eof()

while(!inflie.eof())

{

......................

}

9、二进制文件与文本文件

在某些操作平台上(如unix),二进制文件和文本文件是完全一样的。ios::bianry没有作用。

而在其他一些操作平台上(如MS-DOS/WINDOWS),这两个文件是有区别的,表现如下:

1、当程序向二进制文件写入一个新行符('/n')时,文件系统写入一个字符。在大多数系统上,新行符等同于回行符(0x0a)。

2、当程序把新行符写入到文本文件时,文件系统写入两个字符,即先后写入回行符(0x0a)和回车符(0x0d)。

3、当程序从二进制文件读取一个新行符时,文件系统把单个字符读入内存

4、当程序从文本文件读取匹配的回车符/回行符是,文件系统把这一对字符转换成一个新行符并读入内存

5.、当程序从文本文件读取一个新行符(前面没有回车符的回行符)时,文件系统吧该新行符插入到内存中

 

总上可知,这种差异会导致文本文件在内存中的数据表示与其在磁盘上的数据表示长度是不同的。因此,在文本文件中中查找给定的位置是不可靠的。

想到这里,那么怎样对文本文件实现各种操作那?嗯,可以先把文本文件转化成二进制文件,进行操作,然后再转化成文本文件。只是猜测,嘿嘿,可能有更好的方法,比如知道了差直接转换也是可以的。

 

二进制文件又叫内存映像文件,但并不是说以ios::binary写入的数据就全是01010了,用记事本打开生成的txt文件,我们仍然能够看得懂。估计是记事本会自动不ASCII码或utf-8字符进行转换。


下面是找到的资料

换行(/n)就是光标下移一行却不会移到这一行的开头,回车(/r)就是回到当前行的开头却不向下移一行。

Enter键按下后会执行/n/r这样就是我们看到的一般意义的回车了,所以你用16进制文件查看方式看一个文本,就会在行尾发现"/n/r"。

Tab是制表符,就是"/t",作用是预留8个字符的显示宽度,用于对齐。


新行符(前面没有回车符的换行符)

是的,顾名思义,换行符就是另起一行,回车符就是回到一行的开头,所以我们平时编写文件的回车符应该确切来说叫做回车换行符
---------------------------------------------------------------

在控制台程序里,回车的本意是将光标移动到屏幕最左边(此时光标的横坐标没有变),换行就是将光标移动到下一行(此时光标的纵坐标没有变),两者结合起来就实现了回车(省略说法)效果。
---------------------------------------------------------------

这是DOS的吧。在UNIX中就有点不同了。
在UNIX中,用一个'/n'就可以做DOS中'/n''/r'做的事了。
---------------------------------------------------------------

起源是打字机啦,回车是将打字头复位,换行是将打字纸上卷一行。