我们平时在对一个文件进行操作的时候会进行如下步骤:
- 打开文件;
- 对文件进行操作(一般我们是进行读写操作);
- 关闭文件:
下面我们就围绕linux操作系统中,对一个文件的操作进行简单讲解
一、打开文件
使用 <stdio.h>头文件中的==fopen()==函数即可打开文件,它的用法为
FILE *fopen(const char *path, const char *mode);
path 为文件路径(包括文件名);mode 为打开方式,两个都是字符串,也就是我们输入的时候都是带双引号的;FILE 为一个结构体,用来保存文件信息。
打开方式:
注意:调用fopen()函数时,必须指明打开权限,但可以不指名读写方式(默认为“”t“”)
二、文件的读写
1.以字符形式读写文件
fgetc()
int fgetc(FILE *fp);
fp :为文件指针。fgetc()读取成功时返回读取到的字符,读取到文件末尾或者读取失败时返回EOF(一般我们认为EOF和-1等价,所以这里返回值是int类型)。
fputc()
int fputc(int c, FILE *fp);
c :为要写入的字符;fp:为文件指针。fputc()写入成功时返回写入的字符,失败时返回EOF。
注意:当读取到EOF时,如何区分是读到文件末尾还是文件出错。此时需要用到两个函数 foef()和 ferror()。
// feof()函数:当到达文件末尾时返回非零值,否则返回零值;
int feof(FILE *fp);
// ferror()函数:出错时返回非零值,否则返回零值;
int ferror(FILE *fp);
【示例】:
1 #include <stdio.h>
2 //读函数
3 void read(FILE *fp)
4 {
5 char ch=0;
6 while(ch=fgetc(fp)!=EOF)
7 {
8 printf("%c\r\n",ch);
9 }
10
11 if(feof(fp))
12 printf("文件到达末尾\r\n");
13 else
14 printf("文件出错\r\n");
15 }
16
17 //写函数
18 void write(FILE *fp)
19 {
20 char ch=0;
21 ch=getchar();
22 fputc(ch,fp);
23 fputc('\n',fp);
24 }
25 int main()
26 {
27 FILE *fp;
28 fp=fopen("/home/farsight/Desktop/a.txt","r+");
29 if(fp==NULL)
30 {
31 perror("open file error\n\r");
32 return -1;
33 }
34 read(fp);
35 write(fp);
36 fclose(fp);
37 return 0;
38 }
【结果】:
一般我们对文件操作时,很少以字符为单位进行操作,所以,大家掌握它的用法就可以了,不用管怎么存。
2.以行形式读写文件
fgets()
char *fgets(char *str, int size, FILE *fp);
str:为字符数组;size:为要读取得字符数目;fp:为文件指针。
返回值:读取成功时返回字符数组首地址,读取失败时返回NULL;如果开始读取时,文件指针就在文件末尾,也返回NULL。
fputs()
int fputs(const char *str, FILE *fp);
str:为要写入的字符串;fp:为文件指针返回值:写入成功返回非负数,写入失败返回EOF。
【示例】:
1 #include <stdio.h>
2
3 int main()
4 {
5 int ret=0;
6 FILE *fp=fopen("/home/farsight/Desktop/source/a.txt","r+");
7 if(fp==NULL)
8 {
9 printf("打开文件失败\r\n");
10 }else{
11 printf("打开文件\r\n");
12 }
13
14 char str[100]="hello C is the best language";
15 char arr[100]={0};
16 if(ret=fputs(str,fp)!=EOF)
17 {
18 puts("写入成功");
19 }
20 else
21 {
22 puts("写入失败");
23 }
24
25 FILE *fq=fopen("/home/farsight/Desktop/source/b.txt","r+");
26 fgets(arr,sizeof(arr),fq);
27 printf("%s",arr);
28
29 fclose(fp);
30 fclose(fq);
31 return 0;
32
33 }
【结果】:
3.以数据块方式读写文件
fread()
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *fp);
ptr:存放读入记录的缓冲区;size:读取的每个记录的大小;nmemb:读取的记录数;fp:要读取的文件流。返回值:成功返回实际的读取数,失败返回EOF。
fwrite()
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *fp);
ptr:存放写入记录的缓冲区;size:写入的每个记录的大小;nmemb:写入的记录数;fp:要读取的文件流。返回值:成功返回实际写入的nmemb的数目,失败返回EOF。
【示例】:
1 #include <stdio.h>
2 #define N 1024
3
4 int main()
5 {
6 char str[N]={0};
7 char wrr[N]="收到";
8 FILE *fp=fopen("/home/farsight/Desktop/source/a.txt","a+");
9 if(NULL==fp)
10 {
11 perror("文件打开失败");
12 return -1;
13 }
14 int a= fread(str,sizeof(char),N,fp);
15 printf("%s\n",str);
16 printf("a=%d\n",a);
17
18 rewind(fp);
19
20 int b=fwrite(wrr,sizeof(char),N,fp);
21 printf("b=%d\n",b);
22 fclose(fp);
23 return 0;
24 }
【结果】:
三、关闭文件
当我们操作完文件后,应该使用==fclose()==函数关闭文件,以释放相关资源,避免数据丢失。用法为:
int fclose(FILE *fp);
fp为文件指针,就是fopen()函数的返回值;文件正常关闭时,返回为0,如果返回非零值则表示有错误发生。