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


    1.fgets和fputs

    #include <stdio.h>
    int fputs(const char * str, FILE * stream);
    功能:将str所指定的字符串写入到stream指定的文件中,字符串结束符 ''  不写入文件。 
    参数:
        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
    ";
      8 //  fputs(p1,fp);
      9     char *p2="world
    ";
     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个字符为止,最后会自动加上字符 '' 作为字符串结束。
    参数:
        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
    ",buf);
     15 
     16     fgets(buf,sizeof(buf),fp);
     17     printf("buf=%s
    ",buf);
     18 
     19     fgets(buf,sizeof(buf),fp);
     20     printf("buf=%s
    ",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
    ",buf);
     15 
     16     fgets(buf,sizeof(buf),fp);
     17     printf("buf=%s
    ",buf);
     18     memset(buf,0,sizeof(buf));
     19
     20     fgets(buf,sizeof(buf),fp);
     21     printf("buf=%s
    ",buf);
     22 
     23     fclose(fp);
     24     return 0;
     25 }  

      2.fprintf和fscanf

    #include <stdio.h>
    int fprintf(FILE * stream, const char * format, ...);
    功能:根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符 ''  为止。
    参数:
        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
    ",num);
     17       //num放在%d的位置,然后此字符串写在(显示)在fp所关联的文件
     18       fprintf(fp,"%d
    ",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
    ",&num);
     14       printf("num=%d
    ",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
    ",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
    ",ret);
     16      int i=0;
     17      int n=1;
     18      for(i=0;i<n;i++)
     19      {
     20          printf("%d,%s,%d
    ",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
    ");
      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个英文字母,没有问题

    知识的二道贩子,此博客仅仅是个人学习总结!
  • 相关阅读:
    北航OO第三单元总结
    北航OO第二单元总结
    提问回顾和个人总结
    Unity 制作不规则形状button
    Unity 3D手游对不同分辨率屏幕的UI自适应
    软工结队作业
    CSDN app分析
    软工作业——求交点
    软工第一次作业
    软工热身作业
  • 原文地址:https://www.cnblogs.com/xiangdongBig1/p/11846073.html
Copyright © 2020-2023  润新知