以下是c语言对文件的基本操作:
1.使用文件的方式有哪些:
文件使用方式 | 含义 |
"r" (只读) | 打开一个文本文件,只允许读数据 |
"w" (只写) | 打开或建立一个文本文件,只允许写数据 |
"a" (追加) | 打开一个文本文件,并在文件末尾写数据 |
"rb" (只读) | 打开一个二进制文件,只允许读数据 |
"wb" (只写) | 打开或建立一个二进制文件,只允许写数据 |
"ab" (追加) | 打开一个二进制文件,并在文件末尾写数据 |
"r+" (读写) | 打开一个文本文件,允许读和写 |
"w+" (读写) | 打开或建立一个文本文件,允许读和写 |
"a+" (读写) | 打开一个文本文件,允许读,或在文件末追加数据 |
"rb+" (读写) | 打开一个二进制文件,只允许读和写 |
"wb+" (读写) | 打开或建立一个二进制文件,允许读和写 |
"ab+" (读写) | 打开一个二进制文件,允许读,或在文件末追加数据 |
2.文件的打开函数fopen:
其调用格式一般如下:
FILE *fp;
fp=fopen(文件名,使用文件方式);
3.文件的关闭函数fclose:
fclose(文件指针);
例如:fclose(fp);
4.文件的读写
4.1 fputc函数
fputc函数的作用是把一个字符写到磁盘文件(fp所指向的文件)中,其调用的一般格式如下:
ch=fputc(ch,fp);
其中,ch是要输出的字符,它可以是一个字符常量,也可以是一个字符变量;fp是文件指针变量。当函数输出成功则返回值就是输出的字符;如果输出失败,则返回EOF。
4.2 fgetc函数
fgetc函数的作用是从指定的文件(fp指向的文件)读入一个字符赋给ch(注意,该文件必须是以读或读写的方式打开)。当函数遇到文件结束符时将返回一个文件结束标志EOF。
其调用的一般格式如下:
ch=fgetc(fp);
4.3 fread函数和fwrite函数
fputc和fgetc函数每次只能读写文件中的一个字符,但是在编写程序的过程中往往需要对整块数据进行读写,列如对一个结构体类型变量值进行读写,此时就用到了fread和fwrite函数。
1.fread函数
fread函数的作用是从fp所指向的文件中读入count次,每次读size字节,读入的信息存储在buffer地址中。
fread函数的一般格式如下:
fread(buffer,size,count,fp);
2.fwrite函数
fwrite函数的作用是将buffer地址开始的信息输出count次,每次写size字节到fp所指向的文件。
fwrite函数的一般格式如下:
fwrite(buffer,size,count,fp);
例如:
fread(a,2,3,fp);
其含义是从fp所指向的文件中,每次读2个字节送入数组a中,连续读3次。
fwrite(a,2,3,fp);
其含义是将a数组中的信息每次输出2个字节到fp所指向的文件中,连续输出3次。
5.文件的定位
要实现搜索定位功能,除了fseek函数外,还有两个函数在编写程序的过程中也会经常遇到,即rewind函数和ftell函数。
5.1 rewind函数
rewind函数的作用是使位置指针重新返回文件的开头,该函数没有返回值。
rewind函数的一般格式如下:
int rewind(文件类型指针)
5.2 ftell函数
ftell函数的作用是得到流式文件中的当前位置,用相对于文件开头的位移量来表示。当ftell函数返回值为-1L时,表示出错。
ftell函数的一般格式如下:
long ftell(文件类型指针)
例如:
long i;
if((i=ftell(fp))==-1L)
printf("error");
5.3 fseek函数
fseek(文件类型指针,位移量,起始点);
该函数的作用是移动文件内部位置指针。其中,"文件类型指针"指向被移动的文件;"位移量"表示移动的字节数,要求位移量是long型数据,以便在文件长度在大于64k时,常用常量表示位移量时,要求加后缀"L";"起始点"表示从何处开始计算位移量,规定的起始点有3种,即文件首、当前位置和文件末尾。
起始点 | 表示符号 | 字数表示 |
文件首 | SEEK-SET | 0 |
当前位置 | SEEK-CUR | 1 |
文件末尾 | SEEK-END | 2 |
fseek(fp,-20L,1);
表示将位置指针从当前位置向后退20个字节。
说明:
fseek函数一般用于二进制文件;在文本文件中由于要进行转换,故往往计算的位置会出现错误。对文件进行随机读写时,在移动位置指针后,即可以用前面介绍的任一读写函数进行读写。
实例:合并两个文件的内容
/*合并两个文件的内容*/
#include<stdio.h>
#include<stdlib.h>
int main()
{
char ch,filename1[50],filename2[20]; /**/
FILE *fp1,*fp2; /*定义两个指向FILE类型结构体的指针*/
printf("please input filename1:\n");
scanf("%s",filename1); /*输入文件所在的路径名称*/
if((fp1=fopen(filename1,"a+"))==NULL) /*在文件末尾追加的方式打开*/
{
printf("无法打开此文件!\n");
exit(0);
}
printf("file:\n");
ch=fgetc(fp1);
while(ch!=EOF) /*将文件1中的内容输出*/
{
putchar(ch); /*putchar()一次输出一个字符*/
/*fgetc()一次读取一个字符*/
ch=fgetc(fp1);
}
printf("\n请输入文件2的名字:\n");
scanf("%s",filename2);
if((fp2=fopen(filename2,"r"))==NULL) /*以只读的方式打开*/
{
printf("无法打开此文件!\n");
exit(0);
}
printf("file2:\n");
ch=fgetc(fp2);
while(ch!=EOF) /*将文件2中的内容输出*/
{
putchar(ch); /*putchar()一次输出一个字符*/
/*fgetc()一次读取一个字符*/
ch=fgetc(fp2);
}
fseek(fp2,0L,0); /*将文件2中的位置指针移到文件开始处*/
ch=fgetc(fp2);
while(!feof(fp2))
{
fputc(ch,fp1); /*将文件2中的内容输出到文件1中*/
ch=fgetc(fp2);
}
fclose(fp1);
fclose(fp2);
return 0;
}
合并前文档的内容
最后补充一点有时候为什么把东西写进文件后变成了乱码????????????