博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Linux C/C++基础 文件(下)

Posted on 2019-11-13 21:54  煮酒论天下  阅读(223)  评论(0编辑  收藏  举报

1.fgets和fputs

#include <stdio.h>
int fputs(const char * str, FILE * stream);
功能:将str所指定的字符串写入到stream指定的文件中,字符串结束符 '\0'  不写入文件。 
参数:
    str:字符串
    stream:文件指针
返回值:
    成功:0
    失败:-1
  1 #include<stdio.h>                                                                                          
  2 
  3 int main()
  4 {
  5     FILE *fp=fopen("10.txt","w");
  6     //添加换行符,不然会加在后面,不会自动换行
  7     char *p1="hello\n";
  8 //  fputs(p1,fp);
  9     char *p2="world\n";
 10     //指针数组,每个元素都是指针
 11     char *p3[]={p1,p2};
 12     int n=sizeof(p3)/sizeof(p3[0]);
 13     for(int i=0;i<n;i++)
 14     {
 15         fputs(p3[i],fp);
 16     }
 17     fclose(fp);
 18     fp=NULL;
 19     return 0;
 20 }

#include <stdio.h>
char * fgets(char * str, int size, FILE * stream);
功能:从stream指定的文件内读入字符,保存到str所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size - 1个字符为止,最后会自动加上字符 '\0' 作为字符串结束。
参数:
    str:字符串
    size:指定最大读取字符串的长度(size - 1)
    stream:文件指针
返回值:
    成功:成功读取的字符串
    读到文件尾或出错: NULL

 

 #include<stdio.h>                                                                                          
  2 #include<string.h>
  3 
  4 int main()
  5 {
  6     //打开文件
  7     //读文件
  8     //关闭文件
  9     FILE*fp=fopen("10.txt","r");
 10     char buf[100];
 11     //从fp所关联的文件读取内容,放到buf,一次最大读取为 
          sizeof(buf)-1
 12     //遇到换行符,文件结尾,出错,结束本次读取
 13     fgets(buf,sizeof(buf),fp);
 14     printf("buf=%s\n",buf);
 15 
 16     fgets(buf,sizeof(buf),fp);
 17     printf("buf=%s\n",buf);
 18 
 19     fgets(buf,sizeof(buf),fp);
 20     printf("buf=%s\n",buf);
 22     fclose(fp);
 23     return 0;
 24 }                                                                                                          

 

 

 边界值问题:上面的文件中,只有hello和world,但是,当你执行多次输出的时候,

后面的内容都是一样的,这是因为buf的内容没有清空造成的。使用memset函数解决

 #include<stdio.h>                                                                                          
  2 #include<string.h>
  3 
  4 int main()
  5 {
  6     //打开文件
  7     //读文件
  8     //关闭文件
  9     FILE*fp=fopen("10.txt","r");
 10     char buf[100];
 11     //从fp所关联的文件读取内容,放到buf,一次最大读取为 
          sizeof(buf)-1
 12     //遇到换行符,文件结尾,出错,结束本次读取
 13     fgets(buf,sizeof(buf),fp);
 14     printf("buf=%s\n",buf);
 15 
 16     fgets(buf,sizeof(buf),fp);
 17     printf("buf=%s\n",buf);
 18     memset(buf,0,sizeof(buf));
 19
 20     fgets(buf,sizeof(buf),fp);
 21     printf("buf=%s\n",buf);
 22 
 23     fclose(fp);
 24     return 0;
 25 }  

 

  2.fprintf和fscanf

#include <stdio.h>
int fprintf(FILE * stream, const char * format, ...);
功能:根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符 '\0'  为止。
参数:
    stream:已经打开的文件
    format:字符串格式,用法和printf()一样
返回值:
    成功:实际写入文件的字符个数
    失败:-1

 

  1 #include<stdio.h>                                                                                          
  2 #include<time.h>
  3 #include<stdlib.h>
  4 int main()
  5 {
  6    //打开文件
  7    //写文件
  8    //关闭文件
  9    FILE *fp=fopen("10.txt","w");
 10    int num=0;
 11    srand((unsigned int)time(NULL));
 12    for(int i=0;i<10;i++)
 13    {
 14       num=rand()%100;
 15       //num放在%d的位置,然后此字符串写在(显示)在屏幕
 16      // printf("%d\n",num);
 17       //num放在%d的位置,然后此字符串写在(显示)在fp所关联的文件
 18       fprintf(fp,"%d\n",num);
 19    }
 20    fclose(fp);
 21    return 022 }

 

 

#include <stdio.h>
int fscanf(FILE * stream, const char * format, ...);
功能:从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据。
参数:
    stream:已经打开的文件
    format:字符串格式,用法和scanf()一样
返回值:
    成功:参数数目,成功转换的值的个数
    失败: - 1

 

  1 #include<stdio.h>
  2 #include<time.h>
  3 #include<stdlib.h>
  4 int main()
  5 {
  6    //打开文件
  7    //写文件
  8    //关闭文件
  9    FILE *fp=fopen("10.txt","r");
 10    int num=0;
 11    while(1)
 12    {
 13       fscanf(fp,"%d\n",&num);
 14       printf("num=%d\n",num); 
 15       if(feof(fp))
 16       {
 17          break;
 18       }
 19    }
 20    fclose(fp);
 21    return 0;
 22 } 

 

       不会把文件中的换行符打印到屏幕上

 

 3.fwrite和fread

#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:以数据块的方式给文件写入内容
参数:
    ptr:准备写入文件数据的地址
    size: size_t 为 unsigned int类型,此参数指定写入文件内容的块数据大小
    nmemb:写入文件的块数,写入文件数据总大小为:size * nmemb
    stream:已经打开的文件指针
返回值:
    成功:实际成功写入文件数据的块数目,此值和nmemb相等 函数返回值与第三个元素相等
    失败:0

 

int ret=fwrite(&s,15,4,fp)

 

  • &s,需要往文件写内容的变量首地址
  • 15 ,往文件写入内容的块大小
  • 4 ,往文件写入内容的块数目,写入文件的大小为:块大小*块数目=15*4=60
  • fp,操作的文件
  • ret,返回值=4,成功时等于块数目
  • 块大小和块文件只要想乘等于文件大小就可以,可以改变位置,可以改变大小
 #include<stdio.h>
  
 typedef struct Student
 {
       int age;
       char name[50];
       int score;
  }Student;
  
 int main()
 {
       FILE*fp=fopen("/home/lxd/C++project/1.txt","w");
       Student  s[10]={
                    18,"mike",18,
                    22,"hello",8,
                    34,"wrld",56,
                    45,"abc",45,
                    };
       int ret=fwrite(s,sizeof(s),1,fp);
       printf("%d\n",ret);
       fclose(fp);
       return 0;
  }
    

 

写入,但是是二进制文件,看不懂,可以通过fread读出来

 

int ret=fread(&s,15,4,fp)
  • &s,需要读取文件内容的变量首地址
  • 15 ,读取文件写入内容的块大小
  • 4 ,读取文件写入内容的块数目,读取文件的大小为:块大小*块数目=15*4=60
  • fp,操作的文件
  • ret,返回值=4,成功时等于块数目,失败是为0
  • 块大小和块文件只要想乘等于文件大小就可以,可以改变位置,可以改变大小
  1 #include<stdio.h>
  2 
  3 typedef struct Student
  4 {
  5     int age;
  6     char name[50];
  7     int score;
  8 }Student;
  9 
 10 int main()
 11 {
 12      FILE*fp=fopen("1.txt","r");
 13      Student  s[10];
 14      int ret=fread(&s[0],sizeof(Student),1,fp);
 15      printf("ret=%d\n",ret);
 16      int i=0;
 17      int n=1;
 18      for(i=0;i<n;i++)
 19      {
 20          printf("%d,%s,%d\n",s[i].age,s[i].name,s[i].score);
 21      }
 22      fclose(fp);
 23      return 0;
 24 }
 25     

 

通过fread读出1.txt中二进制内容,打印在屏幕

 

fread函数越界的情况

  • 如果文件内容大小<用户指定的读取大小,返回值为实际读取的块数目
int ret=fread(&s[0],sizeof(Student),2,fp);

  • 如果文件内容大小>用户指定的读取大小,返回值为用户指定的块数目

 4.最基本的拷贝命令的实现

  1 #include<stdio.h>
  2 
  3 int main(int argc,char*argv[])
  4 {
  5    
  6     if(argc!=3)
  7     {
  8         printf("error\n");
  9         return 0;
 10     }
 11 
 12     FILE *rfp=fopen(argv[1],"r");
 13     FILE *wfp=fopen(argv[2],"w");
 14     int len;
 15     char buf[4*1024];
 16     //循坏操作,从源文件读取多少,再把内容写入到目的文件,读多少,写多少
 17     while(1)
 18     {
 19        //文件的大小用1*sizeof(buf)表示, 块文件的大小用1表示,可以避免错误
 20        len=fread(buf,1,sizeof(buf),rfp);
printf("lem%d",len);
21 if(len==0) 22 { 23 break; 24 } 25 fwrite(buf,1,len,wfp); 26 } 27 28 fclose(rfp); 29 fclose(wfp); 30 31 return 0; 32 } 33

 

26个英文字母,没有问题