嵌入式学习——Linux高级编程复习(标准IO)——day36

1. 标准IO概念——(有缓存、流指针)

(1)标准IO是编程语言中处理输入和输出的一种通用方法,涉及以下三个预定义的文件指针:

        1. stdin:标准输入,通常默认关联到键盘输入。

        2. stdout:标准输出,通常默认关联到屏幕输出。

        3.  stderr:标准错误,同样通常关联到屏幕输出。

        注意:stdin、stdout、stderr程序默认打开

(2)除此之外,标准IO库还支持文件操作,通过fopen打开文件,fclose关闭文件,以及fread, fwrite, fscanf, fprintf等函数进行读写操作。此外,它还处理不同类型的缓冲策略(全缓冲、行缓冲、无缓冲)来优化I/O性能。

(3)标准IO的一个重要特点是它对字符流进行了抽象,使程序可以一致地处理文本和二进制数据

        ASCLL码文件:程序代码、文本文件 ——  fgetc/fputc、fgets/fputs 、fprintf/fscanf

        二进制文件:音视频、图片、压缩包  ——  fwrite/fread

(4)标准IO是一种有缓存的IO形式(接收了一部分内容后给到linux内核中)

         标准IO是库函数,库函数可以在Windows和Linux系统中都能运行

2. 流和流指针

2.1 流

        你声明一个FILE *fp ,并把fopen(某个文件)返回的值赋予fp这两个动作就相当于建立了一个水龙头,当你用getc(fp)之类的输入函数读取文件字符时就相当于拧开了水龙头,每读取一个字符,这个文件就像水一样的流动一下,fp所指的地址自然就向后移动了一位。

        int ch;

                while((ch=getc(fp))!=EOF)

        putchar(ch);

        这个循环,可以读取一个文件的所有字符。如果不是流的话,ch永远是第一个字符,不会更新。也可以理解为,fp自动++(一个字符的大小)。

2.2 流指针

        它主要用于跟踪文件的当前位置以及指示下一个读取或写入操作将在文件中进行的位置。流指针的主要作用是跟踪文件的位置,这样在进行文件读写操作时就知道从哪里开始读取或者写入数据。在文件读取时,流指针会自动向前移动,以便指向下一个要读取的数据;而在文件写入时,流指针也会相应地移动,以便确保数据被写入到正确的位置。

2. 标准IO——函数接口整理

    1.打开文件    fopen
    2.读写文件
                        fgetc/fputc
                        fgets/fputs 
                        fprintf/fscanf

                        fwrite/fread
    3.关闭文件    fclose

    4. 流的定位函数接口

                        fseek、rewind、ftell

2.1 fopen

        1. 定义

              FILE *fopen(const char *pathname, const char *mode);

        2. 功能

                打开一个文件,并与文件建立一个流

        3. 参数

                pathname:指向文件路径字符串的首地址的指针

                mode:指向一个字符串的指针
                    "r"        只读打开               文件存在只读打开,文件不存在报错
                    "r+"      读写打开               文件存在读写打开,文件不存在报错
                    "w"       只写打开               文件存在清0只写打开,文件不存在创建文件
                    "w+"     写读打开               文件存在清0写读打开,文件不存在创建文件
                    "a"        追加只写打开        文件存在追加只写打开,文件不存在创建文件
                    "a+"      追加读写打开        文件存在追加写读打开,文件不存在创建文

        4. 返回值

                成功返回一个文件流指针
                失败返回NULL

        5. 示例程序

#include <stdio.h>

int main(void)
{
	FILE *fp = NULL;

	fp = fopen("file.txt", "a");
	if (NULL == fp)
	{
		perror("fail to fopen");
		return -1;
	}

	return 0;
}

        6. 注意

                perror功能和printf类似,但perror能打印出错的原因

2.2 fclose

        1. 定义

              int fclose(FILE *stream); 

        2. 功能

                关闭文件流指针对应的流

        3. 参数

                stream:文件流指针 

        4. 返回值

                成功返回0 
                失败返回EOF(-1)

        5. 示例程序

#include <stdio.h>

int main(void)
{
	FILE *fp = NULL;

	fp = fopen("a.txt", "w");
	if (NULL == fp)
	{
		perror("fail to fopen");
		return -1;
	}
	
	fclose(fp);

	return 0;
}

        6. 注意

        正常情况下都会关掉,不用在意返回值

2.3 fputc

        1. 定义

                  int fputc(int c, FILE *stream);

        2. 功能

                    向流中写入c对应的字符

        3. 参数

                    c:写入流中的字符对应的ASCII码值
                    stream:文件流指针

        4. 返回值

        5. 示例程序

        6. 注意

2.4 fgetc

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

2.5 fputs

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

2.6 fgets

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

2.7 fwrite

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

2.8 fread

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

2.9 fprintf

        1. 定义

        2. 功能

                向指定流中打印格式化字符串

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

2.10 fscanf

        1. 定义

                int fprintf(FILE *stream, const char *format, ...);

        2. 功能

                从流中接收格式化字符串

        3. 参数

                stream:文件流指针
                format:字符串格式
                ...:变量表达式

        4. 返回值

                成功返回打印字符的个数
                失败返回负数

        5. 示例程序

#include <stdio.h>
 
int main(void)
{
    FILE *fp = NULL;
    int num1 = 200;
    int num2 = 300;
    char tmpbuff[1024] = {0};
    int year = 2022;
    int mon = 8;
    int day = 10;
    int hour = 10;
    int min = 16;
    double pi = 3.1415926;
 
    fp = fopen("file.txt", "w");
    if (NULL == fp)
    {
        perror("fail to fopen");
        return -1;
    }
 
//  fprintf(fp, "[%04d-%02d-%02d %02d:%02d]:%.2lf\n", year, mon, day, hour, min, pi);
#if 1
    fprintf(fp, "hello world\n");
    fprintf(fp, "num1 = %d, num2 = %d\n", num1, num2);
//    sprintf(tmpbuff, "num1 = %d, num2 = %d\n", num1, num2);
//    fputs(tmpbuff, fp);
#endif
 
    fclose(fp);
 
    return 0;
}

        6. 补充:

        sprintf

        sprintf函数是C语言中的一个格式化输出函数,类似于printf,但它不是将输出写到标准输出(通常是屏幕),而是格式化后的字符串会被写入到一个字符数组(缓冲区)中

#include <stdio.h>

int main() {
    char buffer[50]; // 创建一个足够大的缓冲区来存放格式化后的字符串

    // 将整数和浮点数格式化到字符串中
    int num = 123;
    float pi = 3.14159f;
    sprintf(buffer, "Number: %d, PI: %.2f", num, pi);

    // 输出缓冲区中的字符串
    printf("Formatted string: %s\n", buffer);

    return 0;
}

        sscanf

        sscanf是C语言中的一个函数,用于从字符串中读取数据并根据格式说明符解析,类似于scanf,但它是从一个字符串中而不是从标准输入读取数据。

#include <stdio.h>

int main() {
    const char *input = "John Doe, 30"; // 假定这是我们要解析的字符串
    char name[20]; // 用于存放姓名的缓冲区
    int age; // 用于存放年龄的变量

    // 使用sscanf解析字符串
    // 注意逗号和空格在格式字符串中的处理,以及age前的*用于跳过无关字符
    int itemsScanned = sscanf(input, "%[^,], %d", name, &age);

    if (itemsScanned == 2) { // 检查是否成功解析了两个项目
        printf("Name: %s, Age: %d\n", name, age);
    } else {
        printf("Failed to parse the input string.\n");
    }

    return 0;
}

2.11 fseek

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

2.4 rewind

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

2.4 ftell

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

3. 缓存

3.1 全缓存

3.2 行缓存

3.3 不缓存

3.4 setvbuf

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

  • 29
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值