回顾IO库函数接口

基础IO

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

文章目录

  • 基础IO
  • 一、回顾IO库函数接口
    • 1.fopen
    • 2.fwrite
    • 3.fread
    • 4.fseek
    • 5.fclose
  • 二、代码实现及问题
    • 1.创建并打开文件
    • 2.写入数据
    • 3.读取数据
    • 4.代码实现


一、回顾IO库函数接口

1.fopen

回顾IO库函数接口:fopen,fwrite,fread,fclose,fseek–跳转当前读写位置
fopen:
回顾IO库函数接口_第1张图片

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:

回顾IO库函数接口_第2张图片

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:

回顾IO库函数接口_第3张图片

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

5.fclose

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

二、代码实现及问题

代码如下(示例):

1.创建并打开文件

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

在这里插入图片描述

2.写入数据

 #include
 #include
 #include
 #include
 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);

回顾IO库函数接口_第4张图片


解决方案:
要想读取出数据只需跳转读写位置,使用fseek函数跳转至文件开头即可
回顾IO库函数接口_第5张图片
可以将一块大小改为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 }


你可能感兴趣的:(Linux)