我们平时在对一个文件进行操作的时候会进行如下步骤:

  1. 打开文件;
  2. 对文件进行操作(一般我们是进行读写操作);
  3. 关闭文件:

下面我们就围绕linux操作系统中,对一个文件的操作进行简单讲解

一、打开文件

使用 <stdio.h>头文件中的==fopen()==函数即可打开文件,它的用法为

FILE *fopen(const char *path, const char *mode);

path 为文件路径(包括文件名);mode 为打开方式,两个都是字符串,也就是我们输入的时候都是带双引号的;FILE 为一个结构体,用来保存文件信息。

打开方式:

linux samba windows 输入凭证 linux文件输入_文件操作


注意:调用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 }

【结果】:

linux samba windows 输入凭证 linux文件输入_文件操作_02


linux samba windows 输入凭证 linux文件输入_文件指针_03


一般我们对文件操作时,很少以字符为单位进行操作,所以,大家掌握它的用法就可以了,不用管怎么存。

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 }

【结果】:

linux samba windows 输入凭证 linux文件输入_文件指针_04

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 }

【结果】:

linux samba windows 输入凭证 linux文件输入_文件指针_05

三、关闭文件

当我们操作完文件后,应该使用==fclose()==函数关闭文件,以释放相关资源,避免数据丢失。用法为:

int fclose(FILE *fp);

fp为文件指针,就是fopen()函数的返回值;文件正常关闭时,返回为0,如果返回非零值则表示有错误发生。