Desarrollo C/C++, entrada/salida inevitable de E/S (Parte 4) Breve introducción a la implementación de c

Tabla de contenido

一、C-IO

2. Operación de archivo IO

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:

  1. Defina el puntero del archivo y abra el archivo;
  2. Operaciones de lectura y escritura a través de punteros de archivo;
  3. 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*.

Supongo que te gusta

Origin blog.csdn.net/py8105/article/details/129909470
Recomendado
Clasificación