用c语言处理文件
用c语言处理文件只需要用到几个简单的函数:
1.文件的打开和关闭
fopen()函数用来打开一个文件,该函数原型在头文件stdio.h中,调用的一般形式为
1 /* FILE 是c语言内置的一个结构体类型,可以直接使用 */ 2 /* 这里定义了一个指向文件l类型的指针 */ 3 FILE *fp; 4 fp = fopen(文件名,使用文件方式); 5 6 /* 使用文件方式是指要对文件进行哪些操作 */
使用文件方式:
r(只读) 打开一个文本文件,只允许读取数据
w(只写) 打开或建立一个文本文件,只允许写入数据
a(追加) 打开一个文本文件,并在文件末尾写入数据
rb(只读) 打开一个二进制文件,只允许读取数据
wb(只写) 打开或建立一个二进制文件,只允许写数据
wa(追加) 打开一个二进制文件,并在文件末尾写数据
r+(读写) 打开一个文本文件,运行读和写
w+(读写) 打开或建立一个文本文件,允许读和写
a+(读写) 打开一个文本文件,允许读或者在文件末尾追加数据
rb+(读写) 打开一个二进制文件,允许读和写
wb+(读写) 打开或建立一个二进制文件,允许读和写
ab+(读写) 打开一个二进制文件,允许读,或者在文件末尾追加数据
如果使用fopen()函数打开文件失败,通常有下面几种原因:
1. 指定的盘符或路径不存在
2. 文件名中含有无效字符
3. 以r模式打开一个不存在的文件
每次打开文件并操作之后一定要记得关闭文件,这样做的目的是防止因为没有关闭文件而造成的数据流失!
关闭文件用函数 fclose(fp);
当文件正常关闭,该函数返回,否则返回 EOF
2. 文件的读写
fputc(ch,fp); => 该函数把字符ch写入到fp所指向的文件,写入成功则返回被写入的字符,失败则返回EOF
ch = fgetc(fp); => 该函数从fp所指向的文件中读取一个字符赋值给ch,该文件必须是以读或读写的方式打开的
fputs(str,fp); => 该函数向fp指向的文件中写入一个字符串,其中字符串可以是字符串常量,也可以是字符数组名、指针或变量
fgets(*str,n,fp); => 该函数从fp指向的文件中读取一个字符串到str中,n表示读取到字符的个数
fprintf(fp,”%d”,i); => 该函数将i的值以%d格式写入到fp指向的文件中
fscanf(fp,”%d”,&i); => 该函数从fp所指的文件中读取一个字符并以%d的格式赋值给i
fread(str,size,count,fp); => 该函数从fp所指的文件中读入count次,每次读size字节,读入的信息存放在str地址中
fwrite(str,size,count,fp); => 该函数将从str地址开始的数据分 count 次写入 fp 指向的文件中,每次写入size字节
3. 文件的定位
我们对文件的操作不一定每次都要从头开始,所以我们要有办法来移动光标在文件中的位置,在这里介绍几个可以完成定位功能的函数
fseek(fp,nL,i);
该函数在fp所指向的文件内部定位光标,其中 i 的值为 1、2、3。
i = 0 => 定位到文件首
i = 1 => 定位到当前位置
i = 0 => 定位到文件尾
n表示从i所指示位置的位移量,如 fseek(fp,2L,0); 表示从文件头开始向前移动两个字节。
需要注意的是这个函数一般用于二进制文件,在文本文件中由于要进行转换,所以计算的位置往往会出现错误。
rewind(fp);
该函数在fp所指向的文件内部将光标定位到文件开头。
该函数无返回值。
rtell(fp);
该函数得到流式文件中的当前位置,用相对于文件开头的位移量来表示。
当ftell()函数的返回值为 -1L 时,表示出错
测试代码
1 #include<stdio.h> 2 #include<string.h> 3 4 void main() 5 { 6 // 创建文件指针 7 FILE *fp; 8 char ch = 'a'; 9 char *str = "hhhhhhhhhhhhh"; 10 char str1[100]; 11 12 //创建或打开文件 13 fp = fopen("test.txt","w+"); 14 15 // 读入一个字符到文件********************** 16 ch = fputc(ch,fp); 17 18 // 关闭文件 19 fclose(fp); 20 21 fp = fopen("test.txt","r"); 22 // 从文件夹中读取一个字符 *********************** 23 ch = fgetc(fp); 24 printf("从文件夹中读取字符:%c\n",ch); 25 fclose(fp); 26 27 // 写入字符串 ****************************** 28 fp = fopen("test.txt","a"); 29 fputs(str,fp); 30 printf("写入字符串\n"); 31 fclose(fp); 32 33 // 读取字符串 ***************************** 34 fp = fopen("test.txt","r"); 35 fgets(str1,10,fp); 36 printf("从文件中读取字符串:%s\n",str); 37 fclose(fp); 38 39 // 利用 fprintf()函数写入数据到文件***************************** 40 fp = fopen("test.txt","a"); 41 fprintf(fp,"%s","\nhahahahaha"); 42 fclose(fp); 43 44 // 利用 fscanf()函数读取数据到程序*********************************** 45 // 一次读取一个字符串,遇到空格结束 46 fp = fopen("test.txt","r"); 47 fscanf(fp,"%s",str1); 48 printf("从文件夹中读取字符串:%s\n",str1); 49 fscanf(fp,"%s",str1); 50 printf("从文件夹中读取字符串:%s\n",str1); 51 fclose(fp); 52 53 54 // 利用 fread() 和 fwrite() 函数成段读取和传入数据********************************* 55 fp = fopen("test.txt","r"); 56 fread(str1,10,2,fp); 57 printf("从文件夹中读取两次字符串,每次读取10个:%s\n",str1); 58 fclose(fp); 59 60 fp = fopen("test.txt","a"); 61 fwrite("12345678901234567890",10,2,fp); 62 printf("向文件夹中输入两次字符串,每次输入10个字符!\n"); 63 fclose(fp); 64 65 // 文件的定位********************************************** 66 fp = fopen("test.txt","r+"); 67 // 从当前位置向前移两格 68 fseek(fp,2L,1); 69 fscanf(fp,"%s",str1); 70 printf("当前位置字符串为:%s\n",str1); 71 72 // 从文件尾向后退十格 73 fseek(fp,-10L,2); 74 fscanf(fp,"%s",str1); 75 printf("当前位置字符串为:%s\n",str1); 76 77 // 返回文件开头 78 rewind(fp); 79 fscanf(fp,"%s",str1); 80 printf("(开头)当前位置字符串为:%s\n",str1); 81 82 // 返回当前光标的位置,用相对于开头的位移量来表示 83 // 当返回值是-1L时表示出错 84 fseek(fp,20L,0); 85 printf("当前光标在文件中的位置是:%d\n",ftell(fp)); 86 fscanf(fp,"%s",str1); 87 printf("当前位置字符串为:%s\n",str1); 88 89 fclose(fp); 90 }