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  } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值