文件I/O练习题第一天

练习:在本地磁盘打开一个存储少量数据的文本demo.txt,利用fgetc 函数把文本中的字符输出到屏幕,当文本中所有字符都输出完成后就结束程序。

#include <stdio.h>
/**
 * @name       :main
 * @brief      :程序主入口,演示文件读取操作
 * @param      :argc  命令行参数个数
 * @param      :argv  命令行参数数组
 * @return     :程序执行状态(0表示成功,-1表示失败)
 * @date       :2025/07/13
 * @version    :1.0
 * @note       :该程序打开demo.txt文件并输出其内容到终端
 */
int main(int argc, char const *argv[])
{
    // 1.打开demo.txt
    FILE *file = fopen("demo.txt", "r");
    if (NULL == file)
    {
        perror("open demo.txt error");
        return -1;
    }

    // 2.循环读取文本的字符串输出到终端
    int ch = fgetc(file);
    while (ch != EOF)
    {
        printf("%c", ch); // 输出已经获取的字符
        ch = fgetc(file);
    }
    printf("\n");

    // 3.关闭demo.txt
    fclose(file);

    return 0;
}

练习:编写一个程序,检测标准IO 的缓冲区的大小。提示:普通文件默认是全缓冲,可以利用这个特性,一个字节一个字节写入数据,并且在每次写入数据之后获取文件的大小,直到把缓冲区填满即可测得缓冲区的大小,获取文件信息的函数是stat()。

/**
 * @file name : io_buffer_size.c
 * @brief     : 检测标准IO缓冲区大小
 * @author    : qrshxc@163.com
 * @date      : 2025/07/13
 * @version   : 1.0
 * @note      : 
 * CopyRight (c)  2025-2026   qrshxc@163.com   All Right Reseverd
 */
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>

/**
 * @name       get_file_size
 * @brief      获取文件大小
 * @param      filename  文件名
 * @return     文件大小(字节数),出错返回-1  
 * @date       2025/07/18
 * @version    1.0
 * @note       使用stat()函数获取文件信息
 */
long get_file_size(const char *filename) {
    struct stat st;
    if (stat(filename, &st) == -1) {
        perror("stat failed");
        return -1;
    }
    return st.st_size;
}

/**
 * @name       detect_buffer_size
 * @brief      检测标准IO缓冲区大小
 * @param      filename  测试文件名
 * @return     缓冲区大小(字节数),出错返回-1
 * @date       2025/07/13
 * @version    1.0
 * @note       通过逐个字节写入文件并观察文件大小变化确定缓冲区大小
 */
int detect_buffer_size(const char *filename) {
    FILE *fp = fopen(filename, "w");
    if (!fp) {
        perror("fopen failed");
        return -1;
    }

    // 删除可能已存在的文件
    unlink(filename);

    long prev_size = 0;
    int buffer_size = 0;

    // 逐个字节写入,直到文件大小变化
    for (int i = 1; ; i++) {
        fputc('a', fp);
        fflush(fp);  // 确保写入操作完成

        long curr_size = get_file_size(filename);
        if (curr_size == -1) {
            fclose(fp);
            return -1;
        }

        if (curr_size > prev_size) {
            if (prev_size == 0) {
                // 第一次写入,缓冲区为空
                prev_size = curr_size;
            } else {
                // 文件大小变化,说明缓冲区已满
                buffer_size = i - 1;
                break;
            }
        }
    }

    fclose(fp);
    unlink(filename);  // 删除测试文件
    return buffer_size;
}

int main() {
    const char *test_file = "buffer_test.tmp";
    int size = detect_buffer_size(test_file);

    if (size > 0) {
        printf("Standard IO buffer size: %d bytes\n", size);
    } else {
        printf("Failed to detect buffer size\n");
    }

    return 0;
}
posted @ 2025-07-22 09:46  九思0404  阅读(15)  评论(0)    收藏  举报