文件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;
}

浙公网安备 33010602011771号