文件读写

简介: 文件读写

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
目录
相关文章
|
7月前
|
存储 程序员 C语言
C文件读写
【2月更文挑战第14天】C文件读写。
33 1
|
2月前
读写文件使用
读写文件使用
19 2
|
存储 C语言
C 文件读写
C 文件读写。
47 0
|
7月前
|
Java
|
7月前
|
存储 C语言
c文件读写
c文件读写
48 0
|
7月前
|
存储 C语言
向文件读写字符串
向文件读写字符串
38 2
|
7月前
|
存储 移动开发 Linux
C++017-C++文件读写应用
C++017-C++文件读写应用
|
存储 C++ iOS开发
70 C++ - 文件读写
70 C++ - 文件读写
63 0
|
开发者 Python
文件读写
文件读写
|
存储 iOS开发 C++
c++文件读写操作
c++文件读写操作