Tabla de contenido
3. Flujo de cadena (flujo de memoria) IO
4. Dispositivo de abstracción IO
一、C-IO
La entrada/salida de E/S del lenguaje c es proporcionada por la biblioteca estándar <stdio.h> Como su nombre lo indica, stdio es el módulo de E/S de la biblioteca estándar (std). El archivo de encabezado <stdio.h> proporciona compatibilidad general con la manipulación de archivos y proporciona funciones que permiten la entrada/salida de caracteres limitados. Para caracteres anchos, <wchar.h> se agrega como auxiliar, este archivo de encabezado proporciona funciones con capacidades de entrada/salida de caracteres anchos. El flujo de E/S del lenguaje c está representado por el objeto FILE, al que solo se puede acceder y operar a través del puntero de tipo FILE*. Cada flujo está asociado con un dispositivo físico externo (archivo, flujo de entrada estándar, impresora, puerto serie, etc.).
Echemos un vistazo a las funciones principales de stdio:
//定义于头文件 <stdio.h>
FILE 对象类型,足以保有控制 C I/O 流所需的全部信息(typedef)
fpos_t 非数组完整对象类型,足以唯一指定文件的位置和多字节剖析状态(typedef)
//预定义标准流
stdin 与标准输入流关联的 FILE* 类型表达式(宏常量)
stdout 与标准输出流关联的 FILE* 类型表达式(宏常量)
stderr 与标准错误输出流关联的 FILE* 类型表达式(宏常量)
//函数,文件访问
fopen (C11)打开文件(函数)
fopen_s (C11)打开文件(函数)
freopen (C11)以不同名称打开既存的文件流(函数)
freopen_s (C11)以不同名称打开既存的文件流(函数)
fclose 关闭文件(函数)
fflush 将输出流与实际文件同步(函数)
setbuf 为文件流设置缓冲区(函数)
setvbuf 为文件流设置缓冲区和其大小(函数)
//直接输入/输出
fread 从文件读取(函数)
fwrite 写入到文件(函数)
//无格式输入/输出,窄字符
fgetc 从文件流获取一个字符(函数)
getc 从文件流获取一个字符(函数)
fgets 从文件流获取一个字符串(函数)
fputc 将一个字符写入文件流(函数)
putc 将一个字符写入文件流(函数)
fputs 将一个字符串写入文件流(函数)
getchar 从 stdin 读取一个字符(函数)
gets (C11 中移除)从 stdin 读取一个字符串(函数)
gets_s (C11)从 stdin 读取一个字符串(函数)
putchar 将一个字符写入 stdout(函数)
puts 将一个字符串写入 stdout(函数)
ungetc 将一个字符送回文件流(函数)
//有格式输入/输出,窄字符
scanf 从stdin、文件流或缓冲区读取格式化输入(函数)
fscanf ...
sscanf ...
scanf_s (C11)...
fscanf_s (C11)...
sscanf_s (C11)...
vscanf (C99)从 stdin 、文件流或缓冲区读取格式化输入 使用可变参数列表(函数)
vfscanf (C99)...
vsscanf (C99)...
vscanf_s (C11)...
vfscanf_s (C11)...
vsscanf_s (C11)...
printf 打印格式化输出到 stdout 、文件流或缓冲区(函数)
fprintf ...
sprintf ...
snprintf (C99)...
printf_s (C11)...
fprintf_s (C11)...
sprintf_s (C11)...
snprintf_s (C11)...
vprintf 打印格式化输出到stdout、文件流或缓冲区 使用可变参数列表(函数)
vfprintf ...
vsprintf ...
vsnprintf (C99)...
vprintf_s (C11)...
vfprintf_s (C11)...
vsprintf_s (C11)...
vsnprintf_s (C11)...
//文件位置
ftell 返回当前的文件位置指示值(函数)
fgetpos 获取文件位置指示器(函数)
fseek 将文件位置指示符移动到文件中的指定位置(函数)
fsetpos 将文件位置指示器移动到文件中的指定位置(函数)
rewind 将文件位置指示器移动到文件首(函数)
//错误处理
clearerr 清除错误(函数)
feof 检查文件结尾(函数)
ferror 检查文件错误(函数)
perror 显示对应当前错误的字符串到 stderr(函数)
//文件操作
remove 删除文件(函数)
rename 重命名文件(函数)
tmpfile 返回指向临时文件的指针(函数)
tmpfile_s (C11) ...
tmpnam 返回唯一的文件名(函数)
tmpnam_s (C11) ...
//宏常量
EOF int 类型的负值整数常量表达式(宏常量)
FOPEN_MAX 能同时打开的文件数(宏常量)
FILENAME_MAX 保有最长受支持文件名所需的 char 数组大小(宏常量)
BUFSIZ setbuf() 所用的缓冲区大小(宏常量)
_IOFBF 指示全缓冲 I/O 的 setvbuf() 参数(宏常量)
_IOLBF 指示行缓冲 I/O 的 setvbuf() 参数(宏常量)
_IONBF 指示无缓冲 I/O 的 setvbuf() 参数(宏常量)
SEEK_SET 指示从文件首开始寻位的 fseek() 参数(宏常量)
SEEK_CUR 指示从文件当前位置开始寻位的 fseek() 参数(宏常量)
SEEK_END 指示从文件尾开始寻位的 fseek() 参数(宏常量)
TMP_MAX tmpnam 所能生成的最大独有文件数(宏常量)
TMP_MAX_S (C11)tmpnam_s 所能生成的最大独有文件数(宏常量)
L_tmpnam 保有 tmpnam 结果所需的 char 数组大小(宏常量)
L_tmpnam_s (C11)保有 tmpnam_s 结果所需的 char 数组大小(宏常量)
2. Operación de archivo IO
En general, las operaciones con archivos tienen los siguientes pasos:
- Defina el puntero del archivo y abra el archivo;
- Operaciones de lectura y escritura a través de punteros de archivo;
- Cierra el archivo.
El siguiente es un ejemplo simple para demostrar cómo implementar operaciones de entrada y salida de archivos:
//main.c,gcc main.c -o test.exe -std=c11
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
char ch, filename[10];
printf("请输入文件名:");
scanf("%s", filename);
fp = fopen(filename, "w"); // 以写入方式打开文件,如果文件不存在则新建文件
if (fp == NULL)
{
printf("无法打开文件\n");
exit(0);
}
printf("请输入内容:\n");
while ((ch = getchar()) != EOF) // 从键盘读取字符,直到EOF结束
{
fputc(ch, fp); // 将字符写入到文件中
}
fclose(fp); // 关闭文件
printf("写入成功\n");
fp = fopen(filename, "r"); // 以读取方式打开文件
if (fp == NULL)
{
printf("无法打开文件\n");
exit(0);
}
printf("读取内容:\n");
while ((ch = fgetc(fp)) != EOF) // 从文件中读取字符,直到EOF结束
{
putchar(ch); // 将字符输出到屏幕
}
fclose(fp); // 关闭文件
return 0;
}
El código solicita al usuario un nombre de archivo, luego abre el archivo para escribir y escribe la entrada del teclado del usuario en el archivo. A continuación, abra el mismo archivo para leerlo y lea y envíe el contenido del archivo a la pantalla. Puede verificar si la entrada y salida del archivo es exitosa ejecutando el programa.
3. Flujo de cadena (flujo de memoria) IO
No hay una función de secuencia de cadenas incorporada en el lenguaje C, pero se puede simular manualmente mediante los siguientes métodos:
1. Cree un búfer como fuente de salida del flujo de cadenas
char buffer[1024]; // 创建一个大小为1024的缓冲区
2. Use sprintf para formatear los datos que se enviarán al búfer
int x = 10;
float y = 3.14;
char str[] = "hello";
sprintf(buffer, "x=%d, y=%.2f, str=%s", x, y, str);
3. Lea los datos del flujo de cadenas del búfer
char result[1024];
strcpy(result, buffer);
Lo anterior es una forma básica de simular manualmente secuencias de cadenas. Si necesita funciones más avanzadas similares a los flujos de cadenas en C++, como operadores sobrecargados, operadores de entrada/salida personalizados, etc., puede usar C++ para escribir.
4. Dispositivo de abstracción IO
El dispositivo IO abstracto del lenguaje C es principalmente la interacción con la ventana de comandos, que se realiza principalmente a través del flujo estándar predefinido.
stdin 与标准输入流关联的 FILE* 类型表达式
stdout 与标准输出流关联的 FILE* 类型表达式
stderr 与标准错误输出流关联的 FILE* 类型表达式
El flujo estándar predefinido es esencialmente una operación de puntero FILE*. Puede usar las funciones proporcionadas por el archivo de encabezado stdio.h en la biblioteca estándar para realizar operaciones de entrada/salida de pantalla. Las funciones comúnmente utilizadas incluyen printf y scanf.
La función printf puede generar texto formateado para generar contenido en la pantalla:
//main.c,gcc main.c -o test.exe -std=c11
#include <stdio.h>
int main(void) {
printf("Hello, world!\n");
return 0;
}
Y fprintf puede especificar la salida de tipos de ARCHIVO* como stdout global y stderr
//main.c,gcc main.c -o test.exe -std=c11
#include <stdio.h>
int main(void) {
fprintf(stdout,"Hello, world!\n");
return 0;
}
La función scanf puede leer la entrada de datos de la pantalla y almacenar los datos en variables:
//main.c,gcc main.c -o test.exe -std=c11
#include <stdio.h>
int main(void) {
int num;
printf("Enter a number: ");
scanf("%d", &num);
printf("You entered: %d\n", num);
return 0;
}
Por supuesto, de manera similar, fscanf puede especificar la entrada de tipos de ARCHIVO * como stdin global
//main.c,gcc main.c -o test.exe -std=c11
#include <stdio.h>
int main(void) {
int num;
printf("Enter a number: ");
fscanf(stdin,"%d", &num);
printf("You entered: %d\n", num);
return 0;
}
Además de las dos funciones anteriores, el lenguaje C también proporciona muchas otras funciones de entrada/salida de pantalla, como la función puts, la función gets, la función fgets, la función puts, etc., que se pueden seleccionar y usar según las necesidades específicas.
Las funciones aplicables a la entrada y salida de pantalla son más aplicables a las operaciones de archivo.La comparación de entrada y salida de pantalla es esencialmente una operación de tipo ARCHIVO*.