IT评测·应用市场-qidao123.com

标题: 嵌入式Linux系统编程 — 2.1 尺度I/O库简介 [打印本页]

作者: 万有斥力    时间: 2024-6-26 05:56
标题: 嵌入式Linux系统编程 — 2.1 尺度I/O库简介
目录
1 尺度I/O库简介
1.1 尺度I/O库简介
1.2 尺度 I/O 和文件 I/O 的区别
2 FILE 指针
3 尺度I/O库的主要函数简介
4 尺度输入、尺度输出和尺度错误
4.1 尺度输入、尺度输出和尺度错误概念
4.2 示例程序
5 打开文件fopen()
5.1 fopen()函数简介
5.2 新建文件的权限
5.3 示例程序
6 fread()和fwrite()读文件和写文件
6.1 fread()和fwrite()简介
6.2 示例程序
7 fseek()定位
7.1 fseek()函数简介
7.2 示例程序





1 尺度I/O库简介

1.1 尺度I/O库简介

Linux系统中的尺度I/O库是C语言尺度库的一个关键组成部分,它提供了一套丰富的函数接口,用于实行文件的输入输出操作。这些函数定义在<stdio.h>头文件中,包括打开和关闭文件、读取和写入数据、格式化输入输出等。由于尺度I/O是C语言尺度的一部分,因此使用尺度I/O库编写的程序具有良好的可移植性。
1.2 尺度 I/O 和文件 I/O 的区别


2 FILE 指针

FILE 指针的作用相当于文件形貌符,只不外 FILE 指针用于尺度 I/O 库函数中、而文件形貌符则用于文件I/O 系统调用中。
文件 I/O 函数都是围绕文件形貌符进行的,当调用 open()函数打开一个文件时,即返回一个文件形貌符 fd,然后该文件形貌符就用于后续的 I/O 操作。而对于尺度 I/O 库函数来说,它们的操作是围绕 FILE 指针进行的,当使用尺度 I/O 库函数打开或创建一个文件时,会返回一个指向 FILE 类型对象的指针(FILE *) ,使用该 FILE 指针与被打开或创建的文件相关联,然后该 FILE 指针就用于后续的尺度 I/O 操作。
FILE指针是C语言尺度库中用于处理文件输入输出的一种数据类型。它指向FILE布局体的一个实例,这个布局体包含了实行文件操作所需的各种信息,如文件缓冲区、文件状态标志、错误标志以及指向文件当前位置的指针等。
3 尺度I/O库的主要函数简介

(1) 打开文件
  1. fopen(const char *filename, const char *mode)
复制代码

(2) 关闭文件
  1. fclose(FILE *stream)
复制代码

(3) 读取文件
  1. fread(void *ptr, size_t size, size_t count, FILE *stream)
复制代码

(4) 写入文件
  1. fwrite(const void *ptr, size_t size, size_t count, FILE *stream)
复制代码

(5) 从文件中读取一个字符
  1. fgetc(FILE *stream)
复制代码

(6) 从文件中读取一个字符
  1. fputc(int c, FILE *stream)
复制代码

 (7) 从文件中读取一行字符串
  1. fgets(char *str, int num, FILE *stream)
复制代码

 (8) 向文件写入一个字符串
  1. fputs(const char *str, FILE *stream)
复制代码

 (9) 输出数据
  1. fprintf(FILE *stream, const char *format, ...)
复制代码

 (10) 检测文件是否到达文件末尾
  1. feof(FILE *stream)
复制代码

 (11) 检查文件流是否发生了错误
  1. ferror(FILE *stream)
复制代码


4 尺度输入、尺度输出和尺度错误

4.1 尺度输入、尺度输出和尺度错误概念

用户通过尺度输入装备与系统进行交互, 历程将从尺度输入(stdin)文件中得到输入数据,将正常输出数据(譬如程序中 printf 打印输出的字符串) 输出到尺度输出(stdout) 文件,而将错误信息(譬如函数调用报错打印的信息)输出到尺度错误(stderr) 文件。
在Linux系统中,尺度输入(stdin)、尺度输出(stdout)和尺度错误(stderr)是历程与其环境之间通信的三种基本方式。它们是文件形貌符,分别对应文件形貌符0、1和2。下面是它们各自的功能:
尺度输入(stdin)

尺度输出(stdout)

尺度错误(stderr)

4.2 示例程序

下面的简单的示例程序会从尺度输入读取一行文本,然后将这行文本通过尺度输出打印出来,并同时将一个错误消息通过尺度错误输出。
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main() {
  4.     char buffer[1024]; // 缓冲区,用于存储输入
  5.     // 从标准输入读取一行文本
  6.     printf("请输入一些文本:");
  7.     fgets(buffer, sizeof(buffer), stdin); // 使用fgets从stdin读取
  8.     // 将读取的文本通过标准输出打印
  9.     printf("你输入的是:%s", buffer);
  10.     // 检查输入的文本中是否包含空格
  11.     if (strchr(buffer, ' ') != NULL) {
  12.         // 如果包含空格,通过标准错误输出错误信息
  13.         fprintf(stderr, "错误:输入的文本中包含空格。\n");
  14.     }
  15.     return 0;
  16. }
复制代码
在这个程序中:


5 打开文件fopen()

5.1 fopen()函数简介

在文件 I/O 中,使用 open()系统调用打开或创建文件,而在尺度 I/O 中,我们将使用库函数fopen()打开或创建文件, fopen()函数原型如下所示:
  1. #include <stdio.h>
  2. FILE *fopen(const char *path, const char *mode);
复制代码

mode分析对应于 open()函数的 flags 参数取值
r以只读方式打开文件。O_RDONLY
r+以可读、可写方式打开文件。O_RDWR
w以只写方式打开文件,如果参数 path 指定的文件存在,将文件长度截断为 0;如果指定文件不存在则创建该文件。O_WRONLY | O_CREAT | O_TRUNC
w+以可读、可写方式打开文件,如果参数 path 指定的文件存在,将文件长度截断为 0;如果指定文件不存在则创建该文件。O_RDWR | O_CREAT | O_TRUNC
a以只写方式打开文件,打开以进行追加内容(在文件末尾写入),如果文件不存在则创建该文件。O_WRONLY | O_CREAT | O_APPEND
a+以可读、可写方式打开文件,以追加方式写入(在文件末尾写入),如果文件不存在则创建该文件。O_RDWR | O_CREAT | O_APPEND

5.2 新建文件的权限

fopen()只有两个参数 path 和 mode,差别于 open()系统调用,它并没有任何一个参数来指定新建文件的权限。 当参数 mode 取值为"w"、 "w+"、 "a"、 "a+"之一时,如果参数 path 指定的文件不存在,则会创建该文件。
固然调用 fopen()函数新建文件时无法手动指定文件的权限,但却有一个默认值:
  1. S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH (0666)
复制代码
5.3 示例程序

  1. #include <stdio.h>
  2. int main() {
  3.     FILE *file = fopen("example.txt", "w");
  4.     if (file == NULL) {
  5.         perror("Error opening file");
  6.         return 1;
  7.     }
  8.     fprintf(file, "Hello, World!\n");
  9.     fclose(file); // 记得关闭文件
  10.     return 0;
  11. }
复制代码
示例代码中,以写入模式打开example.txt文件。如果文件打开失败,fopen()将返回NULL,通过perror()函数输堕落误信息。乐成打开文件后,使用fprintf()向文件写入内容,并终极使用fclose()关闭文件。运行的效果如下:


6 fread()和fwrite()读文件和写文件

6.1 fread()和fwrite()简介

库函数中使用 fread()用于读取文件数据,函数原型如下所示:
  1. #include <stdio.h>
  2. size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
复制代码

库函数中使用 fwrite()将数据写入到文件中,函数原型如下所示:
  1. #include <stdio.h>
  2. size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
复制代码

6.2 示例程序

下面代码演示了如安在C语言中使用尺度I/O函数fopen、fwrite、rewind、fread和fclose来实行文件的基本读写操作。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main() {
  4.     const char *filename = "example.txt";
  5.     char buffer[] = "Hello, World!";
  6.     char readBuffer[sizeof(buffer)];
  7.     // 打开文件用于写入和读取
  8.     FILE *fp = fopen(filename, "w+");
  9.     if (fp == NULL) {
  10.         perror("Error opening file");
  11.         return 1;
  12.     }
  13.     // 写入数据到文件
  14.     if (fwrite(buffer, 1, sizeof(buffer), fp) != sizeof(buffer)) {
  15.         fclose(fp);
  16.         perror("Error writing to file");
  17.         return 1;
  18.     }
  19.     // 移动文件指针到文件开头,准备读取
  20.     rewind(fp);
  21.     // 从文件读取数据
  22.     if (fread(readBuffer, 1, sizeof(buffer), fp) != sizeof(buffer)) {
  23.         fclose(fp);
  24.         perror("Error reading from file");
  25.         return 1;
  26.     }
  27.     // 确保字符串以空字符结尾
  28.     readBuffer[sizeof(buffer) - 1] = '\0';
  29.     // 打印读取的数据
  30.     printf("Read from file: %s\n", readBuffer);
  31.     // 关闭文件
  32.     fclose(fp);
  33.     return 0;
  34. }
复制代码
程序起首以读写模式打开一个名为"example.txt"的文件,然后向此中写入字符串"Hello, World!"。之后,程序将文件指针重置到文件开头,从文件中读取雷同数量的数据到一个缓冲区,并确保字符串以空字符末端,最后打印读取的字符串并关闭文件。程序还包括了基本的错误检查,以确保文件操作乐成完成。程序运行效果如下:

 
7 fseek()定位

7.1 fseek()函数简介

库函数 fseek()的作用类似于系统调用 lseek(), 用于设置文件读写位置偏移量, lseek()用于文件 I/O,而库函数 fseek()则用于尺度 I/O,其函数原型如下所示:
  1. #include <stdio.h>
  2. int fseek(FILE *stream, long offset, int whence);
复制代码

7.2 示例程序

如下程序如何使用fseek()来设置文件读写位置偏移量。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main() {
  4.     const char *filename = "input.txt";
  5.     char buffer[1024];
  6.     int i;
  7.     // 打开文件用于写入
  8.     FILE *file = fopen(filename, "w");
  9.     if (file == NULL) {
  10.         perror("Error opening file for writing");
  11.         return 1;
  12.     }
  13.     // 提示用户输入文本
  14.     printf("Enter your text (max 1024 characters): ");
  15.     fgets(buffer, sizeof(buffer), stdin); // 从标准输入读取一行文本
  16.     // 写入文本到文件
  17.     fputs(buffer, file);
  18.     // 关闭文件
  19.     fclose(file);
  20.     // 重新打开文件用于读取
  21.     file = fopen(filename, "r");
  22.     if (file == NULL) {
  23.         perror("Error opening file for reading");
  24.         return 1;
  25.     }
  26.     // 移动文件指针到文件开头
  27.     fseek(file, 4, SEEK_SET);
  28.     // 读取文件内容
  29.     while (fgets(buffer, sizeof(buffer), file) != NULL) {
  30.         printf("Read from file: %s", buffer);
  31.     }
  32.     // 关闭文件
  33.     fclose(file);
  34.     return 0;
  35. }
复制代码
代码创建了一个名为"input.txt"的文件,并提示用户输入一段文本。输入的文本被写入到文件中,然后程序重新打开文件跳过前4个字节,并读取剩余的内容,将其打印到屏幕上。如果文件操作过程中出现错误,程序将显示错误信息并退出。运行效果如下:

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4