• Linux学习——标准IO的读写


     

    目录

    一、字符的输入(读单个字符)

    注意事项:

    二、字符的输出(写单个字符)

    注意事项:

    三、行输入(读取整个行)

     四、行输出(输出整行)

     五、二进制读写

    文本文件和二进制的区别:

    二进制读写函数格式:

    注意事项:


    一、字符的输入(读单个字符)

    int  fgetc(FILE *stream);   //函数

     int  getc(FILE *stream);   //宏

     int  getchar(void);   //只能读取标准输入

    成功时返回读取的字符;若到文件末尾或出错时返回EOF(-1),

    getchar()等同于fgetc(stdin)

    注意事项:

    1函数返回值是int类型不是char类型,主要是为了扩展返回值的范围。

    2 tdin 也是FILE *的指针,是系统定义好的,指向的是标准输入(键盘输入)

    3 打开文件后读取,是从文件开头开始读。读完一个后读写指针会后移。读写注意文件位置!

    4 调用getchar会阻塞,等待你的键盘输入

    实验程序:

    1. #include
    2. int main()
    3. {
    4. FILE *fp;
    5. fp = fopen("1.txt","r");
    6. if(fp == NULL)
    7. {
    8. perror("fopen");
    9. return 0;
    10. }
    11. printf("getc = %c\n",fgetc(fp));
    12. fclose(fp);
    13. fp = fopen("1.txt","r");
    14. if(fp == NULL)
    15. {
    16. perror("fopen");
    17. return 0;
    18. }
    19. for(int i = 0;i < 4;i++)
    20. {
    21. printf("getc[%d] = %c\n",i,fgetc(fp));
    22. }
    23. fclose(fp);
    24. printf("getchar = %c\n",getchar());
    25. }

    实验结果: 

     

    二、字符的输出(写单个字符)

    int  fputc(int c, FILE *stream);

    int  putc(int c, FILE *stream);

    int  putchar(int c);

    成功时返回写入的字符;出错时返回EOF(-1)

    putchar(c)等同于fputc(c, stdout)

    注意事项:

    1返回和输入参数都是int类型

    2遇到这种错误:Bad file descriptor,  很可能是文件打开的模式错误(只读模式去写,只写模式去读)

    实验程序:

    1. #include
    2. int main()
    3. {
    4. FILE *fp;
    5. fp = fopen("1.txt","r");
    6. if(fp == NULL)
    7. {
    8. perror("fopen");
    9. return 0;
    10. }
    11. printf("getc = %c\n",fgetc(fp));
    12. fclose(fp);
    13. fp = fopen("1.txt","r");
    14. if(fp == NULL)
    15. {
    16. perror("fopen");
    17. return 0;
    18. }
    19. for(int i = 0;i < 4;i++)
    20. {
    21. printf("getc[%d] = %c\n",i,fgetc(fp));
    22. }
    23. fclose(fp);
    24. printf("getchar = %c\n",getchar());
    25. fp = fopen("1.txt","r+");
    26. if(fp == NULL)
    27. {
    28. perror("fopen");
    29. return 0;
    30. }
    31. int rec = 'w';
    32. if(fputc(rec,fp) == -1)
    33. {
    34. perror("fputc");
    35. fclose(fp);
    36. return 0;
    37. }
    38. for(int i = 0;i < 4;i++)
    39. {
    40. printf("getc[%d] = %c\n",i,fgetc(fp));
    41. }
    42. fclose(fp);
    43. return 0;
    44. }

    结果:

      

    第一个a被写成了w,但是再次输出却是从b开始的, putchar就是直接输出到屏幕上,不多解释了。

    三、行输入(读取整个行)

    char  *gets(char *s);  读取标准输入到缓冲区s

    char *fgets(char *s, int size, FILE *stream);

    成功时返回s,到文件末尾或出错时返回NULL

    遇到’\n’或已输入size-1个字符时返回,总是包含’\0’

    注意事项:

    1 gets函数已经被淘汰,因为会导致缓冲区溢出

    2 fgets 函数第二个参数,输入的数据超出size,size-1个字符会保存到缓冲区,最后添加’\0’,如果输入数据少于size-1 后面会添加换行符。

    实验程序:

    1. #include
    2. int main(int argc,char *argv[]){
    3. FILE *fp;
    4. char *ret;
    5. int retn;
    6. char buff[100];
    7. fp = fopen("1.txt","a+");
    8. if(fp==NULL){
    9. perror("fopen");
    10. return 0;
    11. }
    12. #if 1
    13. ret = fgets(buff,5,fp);
    14. if(ret==NULL){
    15. perror("fgets");
    16. fclose(fp);
    17. return 0;
    18. }
    19. printf("buff=%s\n",buff);
    20. #endif
    21. #if 0
    22. retn = fputs("hello world",fp);
    23. if(retn==-1){
    24. perror("fputs");
    25. }
    26. printf("hahaha\n");
    27. #endif
    28. fclose(fp);
    29. }

    实验结果:

     四、行输出(输出整行)

     实验程序在上面被注释掉的

    把输出位置改成屏幕也就是stdout结果为:

     

     输出到文件里:

     五、二进制读写

    文本文件和二进制的区别:

    存储的格式不同:文本文件只能存储文本。

    计算机内码概念:文本符号在计算机内部的编码(计算机内部只能存储数字0101001....,所以所有符号都要编码)

    文本文件存字符二进制文件存0和1

    二进制读写函数格式:

    size_t fread(void *ptr, size_t size, size_t n, FILE *fp);

    void *ptr  读取内容放的位置指针

      size_t size 读取的块大小

    size_t n 读取的个数

      FILE *fp  读取的文件指针

    size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);

    void *ptr  写文件的内容的位置指针

    size_t size 写的块大小

    size_t n 写的个数

      FILE *fp  要写的文件指针

    注意事项:

    文件写完后,文件指针指向文件末尾,如果这时候读,读不出来内容。

    解决办法:移动指针到文件头;关闭文件,重新打开

     实验程序:

    1. #include
    2. #include
    3. int main()
    4. {
    5. FILE *fp;
    6. fp = fopen("1.txt","r");
    7. if(fp == NULL)
    8. {
    9. perror("fopen");
    10. return 0;
    11. }
    12. char *buff;
    13. buff=(char*)malloc(100);
    14. if(buff==NULL){
    15. return 0;
    16. }
    17. size_t ret;
    18. ret = fread(buff,10,1,fp);
    19. if(ret==-1){
    20. perror("fread");
    21. goto end;
    22. }
    23. printf("buf=%s\n",buff);
    24. end:
    25. free(buff);
    26. fclose(fp);
    27. }

    实验结果:

    实验程序:

    1. #include
    2. #include
    3. typedef struct {
    4. char name[20];
    5. int age;
    6. char sex[10];
    7. }stu;
    8. int main()
    9. {
    10. FILE *fp;
    11. fp = fopen("1.bin","w");
    12. if(fp == NULL)
    13. {
    14. perror("fopen");
    15. }
    16. stu stu1,stu2;
    17. strcpy(stu1.name,"xiaoming");
    18. stu1.age = 20;
    19. strcpy(stu1.sex,"man");
    20. if(fwrite(&stu1,sizeof(stu1),1,fp) == -1)
    21. {
    22. printf("fwrite is default");
    23. return 0;
    24. fclose(fp);
    25. }
    26. fclose(fp);
    27. fp = fopen("1.bin","r");
    28. if(fp == NULL)
    29. {
    30. perror("fopen");
    31. }
    32. if(fread(&stu2,sizeof(stu2),1,fp) == -1)
    33. {
    34. printf("fread is default");
    35. return 0;
    36. fclose(fp);
    37. }
    38. printf("name:%s\nage: %d\nsex: %s\n",stu2.name,stu2.age,stu2.sex);
    39. fclose(fp);
    40. }

    实验结果:

  • 相关阅读:
    【rpc】Dubbo和Zookeeper结合使用,它们的作用与联系(通俗易懂,一文理解)
    【大学英语视听说上】Topic Presentation
    quarkus依赖注入之五:拦截器(Interceptor)
    Transformers北大源
    使用免费开源的Odoo CRM如何有效的获取潜在客户线索的经验分享
    【pytorch深度学习 应用篇02】训练中loss图的解读,训练中的问题与经验汇总
    论不使用除rsa之外的任何其他模块实现RSA加密解密,以及密钥存储
    JavaScript 63 JavaScript 对象 63.6 JavaScript 对象构造器
    【你也能从零基础学会网站开发】Web建站之javascript入门篇 JavaScript中的Screen屏幕对象与Navigator浏览器信息对象
    【牛客网面试必刷】链表篇
  • 原文地址:https://blog.csdn.net/qq_52479948/article/details/127641570