文件读写

简介: 文件读写

write()函数

标准I/O相比,文件I/O对文件的操作更简单直接。 write() 函数用于将数据写入一个已经打开的文件,并返回实际写入的字节数。函数并没有固定写入文件的数据格式,只需要按照字节数操作即可。


注意

没有缓存区的操作。


#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);点击复制复制失败已复制


参数 fd 为已经打开的文件描述符,参数 buf 保存的是写入文件的数据,参数 count 为从 buf 中需要写入文件的字节数。


使用示例:

source.h 文件中定义结构体:

#ifndef _SOURCE_H
#define _SOURCE_H
#define N 32
struct  data
{
  int a;
  char b;
  char buf[N];
};
#endif点击复制复制失败已复制


接下来在 main.c 文件中写入逻辑代码:

#include "source.h"
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#define errlog(errmsg)                                                         \
  perror(errmsg);                                                              \
  printf("--%s--%s--%d--\n", __FILE__, __FUNCTION__, __LINE__);                \
  return -1;
struct data obj = {.a = 1, .b = 'w', .buf = "test"};
int main(int argc, const char *argv[]) {
  int fd;
  if ((fd = open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664)) < 0) {
    errlog("open error");
  }
  if (write(fd, &obj, sizeof(struct data)) < 0) {
    errlog("write error");
  }
  close(fd);
  return 0;
}点击复制复制失败已复制


编译运行:

$ gcc main.c && ./a.out
$ od -c test.txt 
0000000 001  \0  \0  \0   w   t   e   s   t  \0  \0  \0  \0  \0  \0  \0
0000020  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000040  \0  \0  \0  \0  \0  \0  \0  \0
0000050点击复制复制失败已复制


read() 函数

read() 函数从文件描述符 fd 指代的打开文件中读取数据,并返回实际读取的字节数。若返回 0 ,则表示当前读写位置位于文件末尾。与标准I/O的操作同理,每一次的读写都会产生读写位置的偏移。


语法如下:

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);点击复制复制失败已复制


read() 函数参数与 write() 函数一致,只是数据的方向发生了变化。参数 buf 用于保存读取的数据,参数 count为 期望读取的字节数,实际读取的字节数只可能小于或等于count


使用示例:

#include "source.h"
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#define errlog(errmsg)                                                         \
  perror(errmsg);                                                              \
  printf("--%s--%s--%d--\n", __FILE__, __FUNCTION__, __LINE__);                \
  return -1;
int main(int argc, const char *argv[]) {
  int fd;
  struct data obj;
  ssize_t nbyte;
  if ((fd = open("test.txt", O_RDONLY)) < 0) {
    errlog("open error");
  }
  if ((nbyte = read(fd, &obj, sizeof(struct data))) > 0) {
    printf("nbyte = %ld\n", nbyte);
    printf("a = %d b = %c buf = %s\n", obj.a, obj.b, obj.buf);
  }
  close(fd);
  return 0;
}点击复制复制失败已复制


提示

复用上面的 write() 示例中的 source.h 和生成的 test.txt 文件。


编译运行:

$ gcc main.c && ./a.out 
nbyte = 40
a = 1 b = w buf = test
目录
相关文章
|
XML API 数据格式
【Qt 学习笔记】QWidget的enable属性 | API的介绍
【Qt 学习笔记】QWidget的enable属性 | API的介绍
374 0
|
Shell Android开发
Android 如何将 data 分区格式由 ext4 转为 f2fs
Android 如何将 data 分区格式由 ext4 转为 f2fs
1103 0
|
人工智能 编解码
Photoshop的AI功能上新:截图→背景填充一气呵成,再也不怕没拍全了
Photoshop的AI功能上新:截图→背景填充一气呵成,再也不怕没拍全了
216 0
|
7天前
|
人工智能 运维 安全
|
5天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
606 21