回顾IO库函数接口

基础IO

1. 回顾IO库函数接口 2. 学习系统调用IO接口 3. 探讨IO操作句柄 4. 重定向实现 5. 文件系统的了解 6. 动态库与静态库的生成与使用


一、回顾IO库函数接口

1.fopen

回顾IO库函数接口:fopen,fwrite,fread,fclose,fseek–跳转当前读写位置
fopen:
在这里插入图片描述

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

mode:“r”, “r+”, “w”, “w+”, “a”, “a+”, “b”

path:要打开的文件路径名称; 返回值:失败返回NULL;成功返回一个文件流指针FILE*
r只读
r+可读可写
w只写,文件不存在则创建新文件
w+可读可写,文件不存在则创建新文件,文件已经存在则截断
a追加只写-总是将数据写入文件末尾,文件不存在则创建新文件
a+读和追加写,打开文件后从起始读,但是写总是在末尾,文件不存在则创建新文件
b对文件数据进行二进制操作

2.fwrite

fwrite:

在这里插入图片描述

ptr:要写入文件的数据的空间地址; size:块大小; nmemb:块个数; stream:操作句柄--fopen返回的文件流指针; 返回值:成功返回实际写入文件的块个数,失败返回0;

3.fread

fread:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr:一块缓冲区内存空间的地址,用于存放读取的数据; size:块大小; nmemb:块个数; stream:操作句柄--fopen返回的文件流指针; 返回值:成功返回读取到完整块个数; 出错返回0;读取到文件末尾返回0;读取的数据不足一块也返回0; 建议:块大小为1,块个数为操作数据长度,否则若读取一块数据50字节,但是实际只读取了40字节的时候也会返回0,通过返回值无法确定是否已经读取到了数据。

4.fseek

fseek:

在这里插入图片描述

stream:操作句柄-打开文件返回的文件流指针
offset:相对起点开始的偏移量(偏移量可以是负数–正数向后,负数向前)
whence:相对起点—SEEK_SET-起始位置; SEEK_CUR-当前位置; SEEK_END-末尾位置
返回值:成功返回0;失败返回-1;

5.fclose

fclose:
int fclose(FILE *stream);--关闭文件,释放资源

二、代码实现及问题

代码如下(示例):

1.创建并打开文件

   #include<stdio.h>
   #include<stdlib.h>
   #include<unistd.h>
   #include<string.h>
   int main()
   {
       //fopen(文件路径名,打开方式);
       FILE *fp = fopen("./test.txt","r");
       if(fp == NULL){
          perror("fopen error");
          return -1;
      }
      return 0;
  }   
我们这里用的是" r ",并不会创建新文件,所以会报文件不存在的错误 只有 " r " 和 " r+ "不会创建新文件其他的都可以

在这里插入图片描述

2.写入数据

 #include<stdio.h>
 #include<stdlib.h>
 #include<unistd.h>
 #include<string.h>
 int main()
{
     //fopen(文件路径名,打开方式);
     FILE *fp = fopen("./test.txt","w+");
     if(fp == NULL){
         perror("fopen error");
         return -1;
     }
     char *ptr = "今天的天气好晴朗!\n";
     //fwrite(地址,大小,句柄)
     int ret = fwrite(ptr, strlen(ptr), 1, fp);
     if(ret == 0){
         perror("perror fwrite error");
         return -1;
     }
     printf("ret:%d\n", ret);
     return 0;
 }

在这里插入图片描述

3.读取数据

     char buf[1024] = { 0 };
     ret = fread(buf, 1023, 1, fp);
     printf("buf:%s------%d\n", buf, ret);

在这里插入图片描述


解决方案:
要想读取出数据只需跳转读写位置,使用fseek函数跳转至文件开头即可
在这里插入图片描述
可以将一块大小改为5个字节
在这里插入图片描述
所以通常情况下建议块大小设置为1,块个数为你的数据长度

4.代码实现

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 #include<string.h>
  5 int main()
  6 {
  7     //fopen(文件路径名,打开方式);
  8     FILE *fp = fopen("./test.txt","w+");
  9     if(fp == NULL){
 10         perror("fopen error");
 11         return -1;
 12     }
 13     fseek(fp, 10, SEEK_END);
 14     char *ptr = "今天的天气好晴朗!\n";
 15     //fwrite(地址,大小,句柄)
 16     int ret = fwrite(ptr, strlen(ptr), 1, fp);
 17     if(ret == 0){
 18         perror("perror fwrite error");
 19         return -1;
 20     }
 21     printf("ret:%d\n", ret);
 22     //fseek(句柄,偏移量,相对起点)
 23     fseek(fp, 0, SEEK_SET);
 24     char buf[1024] = { 0 };
 25     ret = fread(buf, 1, 1023, fp);
 26     if(ret == 0){
 27         printf("没有读取到数据\n");
 28     }
 29     printf("buf:%s------%d\n", buf, ret);
 30     fclose(fp);
 31     return 0;
 32 }


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李憨憨_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值