c++文件操作精简详解

来源:互联网 发布:seo能自学吗 编辑:程序博客网 时间:2024/04/30 03:12

要读取文件必须包含头文件,这里包含了C++读写文件的方法。

  可以使用fstream类,这个类可以对文件进行读写操作。

  1、打开文件。

  打开文件可以有两种方式,第一种可以使用fstream类的构造函数。

  fstream file(“test.dat”,ios_base::in|ios_base::out|ios_base::app);

  另外一种方法就是使用open函数。

  fstream file;

  file.open(“test.dat”,ios_base::in|ios_base::out|ios_base::app);

  这样就可以打开一个可读写的文件了。如果文件不存在的话,就会创建一个新文件并且以读写方式打开。

  这里需要说明一点,如果文件不存在的话,open函数中第二个参数必须包含ios_base::out|ios_base::app,

  否则就不能正确创建文件。

  2、写文件。

  先进性写文件的操作否则读一个空文件是没有意义的。

  既然是写二进制文件可以向文件中写入一个整形值。写二进制字符只能使用write函数。

  但是write函数的原形是write(const char * ch, int size)。第一个参数是char *类型,所以需要把将要写入

  文件的int类型转换成char *类型。这里的转换困扰了我好几天,不过终于弄明白了。代码如下。

  int temp;

  file.write((char *)(&temp),sizeof(temp));

  3、读文件。

  可以写文件了,读文件就好办多了。读文件需要用到read函数。其参数和write大致相同,read(const char * ch, int size)。

  要把内容读到int类型变量中同样涉及到一个类型转换的问题。和写文件一样。

  int readInt;

  file.read((char *)(&readInt),sizeof(readInt));

  这样文件中的int值就读入到int型变量readInt中了。

  4、文件指针。

  在文件的读写过程中往往需要对文件进行选择性读取。所以需要进行文件指针的移动。这是需要用到seekg和seekp函数。

  在fstream类中有两个文件指针,一个是读取文件的指针,一个是写文件的指针分别用tellg和tellp文件来取得指针的位置。

  同样seekg和seekp两个函数分别是对这两个指针进行移动的函数。这两个函数的参数都是一样的。

  先对几个枚举类型进行一下说明:

  ios_base::beg ——文件开始位置

  ios_base::cur ——文件当前位置

  ios_base::end ——文件末尾位置

  下面以seekg为例说明一下指针移动的方法:

  file.seekg(3) ——指针移动到第三个字符的位置

  file.seekg(ios_base::beg) ——指针移动到文件开头

  file.seekg(ios_base::end) ——指针移动到文件末尾

  file.seekg(-3,ios_base::cur) ——指针当前位置向前移动三个字符

  file.seekg(3,ios_base::cur) ——指针当前位置向后移动三个字符

  file.seekg(3,file.tellg()) ——指针当前位置向后移动三个字符

  file.seekg(file.tellg()+3) ——指针当前位置向后移动三个字符

  5、对文件操作完毕后别忘了关闭文件。

  file.close();

  以上5个步骤就完成了对文件的读写操作。文本文件的操作是相同的,比二进制文件还要简单。


函数原型: void *memcpy(void*dest, const void *src, size_t n);
功能: 由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。
头文件

#include<string.h>

返回值 : 函数返回一个指向dest的指针。

说明:1.source和destin所指内存区域不能重叠,函数返回指向destin的指针。
2.与strcpy相比,memcpy并不是遇到’\0’就结束,而是一定会拷贝完n个字节。 memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;
例:

char a[100], b[50];      memcpy(b, a,sizeof(b)); //注意如用sizeof(a),会造成b的内存地址溢出。      strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;例:      char a[100], b[50];    strcpy(a,b);

  3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。

  //注意,source和destin都不一定是数组,任意的可读写的空间均可,例如文件指针。


fscanf()函数(有点像正则表达式):

功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。

用 法:int fscanf(FILE *stream, char *format,[argument…]);

int fscanf(文件指针,格式字符串,输入列表);

  for example:

  FILE*fp;

  char a[10];

  int b;

  double c;

  fscanf(fp,”%s%d%lf”,a,&b,&c)

  返回值:整型,数值等于[argument…]的个数

其中的format就是相当于正则表达式中的格式,即用什么样的格式来分隔文件中的信息。光说不好理解,一下用一个例子来说明具体怎么用:

首先我有一个data。txt的文件里面的数据格式如下:

2,50,41,w,20.585828

4,52,51,r,52.012547

…………………….

许多条类似的记录,都是以,来分隔的

…………………..

我实现的功能就是把上面文件中的数据的五个字段赋值给相应的五个变量,并且输出这些变量的值。实现的程序如下:

#include<stdio.h>#include<stdlib.h>int main(){  int fd;  long dev;  long offset;  long length;  char ch;  double ts=0.000000;  if((fd=fopen("/home/haixian/ceshi/data.txt","r"))<0)   {     printf("open the file is error!\n");     exit(0);   }  lseek(fd,0,SEEK_SET);  while(5==fscanf(fd,"%ld,%ld,%ld,%c,%lf\n",&dev,&offset,&length,&ch,&ts))  {在这里就是第二个参数指定分隔参数的格式,在这里使用的是,来分隔。这样就很容易的获取了记录的各个字段的值并不需要自己编写函数来进行解析什么的。     printf("%ld,%ld,%ld,%c,%lf\n",dev,offset,length,ch,ts);  }close(fd);return 0;}

freopen与fopen的区别

C语言中freopen()函数是用来重新定向的,所谓重新定向是给输入和输出的位置重新定向。原本输入位置是键盘缓存区,输出在屏幕上,用了重新定向后可以将输入位置改变成一个文件,而输出位置也可以输出到一个文件中,具体代码可以这么写:

freopen (“text.txt”,”r”,stdin); freopen (“text1.txt”,”w”,stdout);

这里输入和输出便都在文件中操作了。可是这样做有一个弊端,就是至始至终所有输入输出都将在文件中操作,如何灵活控制呢?这就要用到fopen()函数了,可以自由在文件输入输出中转换,具体语法是:

FILE *fin,*fout; fin = fopen(“text.txt”,”rb”); fout=fopen(“text1.txt”,”wb”); fscanf (fin,”%d”,&x); fprintf (fout,”%d”,x); fclose(fin); fclose(fout);

这里函数稍微复杂了些,不过仔细看看也蛮简单的,最重要的是多了文件关闭操作,关闭之后就可以从键盘输入数据了,这样是为了不持续占用系统资源。在读取、写入操作时用加入b 字符用来告诉函数库以二进制模式打开文件。如果不加b,表示默认加了t,即rt,wt,其中t表示以文本模式打开文件。同样,scanf和printf函数都要改成fscanf和fprintf,在前面加上你要输入的文件和输出的文件名,这样就可以有选择性的操作文件了。

参考:(原创)Final博客(http://www.finalblog.net/archives/257)本文可以任意转载,但本段内容必须保留,否则将追究其法律责任。

0 0