1. 回顾C语言文件接口
hello.c 写文件
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp = fopen("myfile", "w");
if(!fp) printf("fopen error!\n");
const char* msg = "hello C programming language";
int count = 5;
while(count--) fwrite(msg, strlen(msg), 1, fp);
fclose(fp);
return 0;
}
FILE *fp:定义一个指向 FILE 结构的指针 fp,用于处理文件操作。
fopen("myfile", "w"):
尝试以写入模式("w")打开名为 "myfile" 的文件。
如果文件不存在,fopen 会创建一个新的空文件。
如果文件已经存在,内容会被清空。
fwrite(msg, strlen(msg), 1, fp):
msg:要写入的内容。
strlen(msg):要写入的字节数(字符串的长度)。
1:要写入的块数。
fp:目标文件指针。
使用 fclose(fp) 关闭打开的文件,确保所有缓存的内容被写入磁盘,并释放系统资源。
运行结果:
注意 :
在C/C++编程中, 如果打开一个文件后不调用fclose()来关闭它, 可能会导致一下集中后果:
1. 资源泄露'
没打开一个文件, 操作系统都会分配一定的资源(如文件句柄或文件描述符). 如果不关闭文件, 系统的资源将持续占用, 最终可能导致资源耗尽, 无法打开新的文件或进行其他操作, 这种情况在长时间运行的程序或需要频繁打开文件的程序中特别明显(一旦发现, 后果不堪设想~)
2. 数据末写入
文件通常会使用缓冲区来提高写入效率, 在调用fwrite(), fprintf() 等函数时, 数据首先被写入到内存缓冲区中, 而不是立即写入文件, 如果程序在未调用fclose()的情况下终止(例如, 异常, 崩溃或使用exit()), 缓冲区中的数据可能不会被写入到文件中, 从而导致数据丢失~
hello.c 读文件
int main()
{
FILE* fp = fopen("myfile", "r");
if(!fp) printf("fopen error!\n");
char buf[1024];
const char * msg = "hello linux!\n";
while(1)
{
size_t s = fread(buf, 1, strlen(msg), fp);
if(s > 0)
{
buf[s] = 0;
printf("%s", buf);
}
if(feof(fp)) break;
}
fclose(fp);
return 0;
}
使用 fopen 函数以只读模式("r")打开名为 "myfile" 的文件。如果文件打开失败(如文件不存在),fopen 将返回 NULL,程序会打印错误信息。
while(1) 创建一个无限循环。
使用 fread 函数从文件中读取数据:
第一个参数是目标缓冲区 buf,第二个参数是每次读取的字节大小(1),第三个参数是要读取的字节数(这里是 strlen(msg),即 13 字节)。
如果 fread 成功读取到数据,则 s 将大于 0。
通过 buf[s] = 0; 将读取的数据结尾标志设置为 '\0',以确保后续的 printf 函数正确打印字符串。
然后使用 printf 输出读取到的内容。
使用 feof(fp) 检查文件是否结束,如果是,则跳出循环。
最后关闭打开的文件,释放系统资源。
结果展示:
可以看到, 已经将我们之前写入文件的信息全部打印出来了~
输出信息到显示器
#include <stdio.h>
#include <string.h>
int main()
{
const char *msg = "hello fwrite\n";
fwrite(msg, strlen(msg), 1, stdout);
printf("hello printf\n");
fprintf(stdout, "hello fprintf\n");
return 0;
}
fwrite 函数用于从内存块写入数据到文件或输出流。
第一个参数是待写入的内存地址,这里是 msg。
第二个参数是每个元素的大小,这里是 strlen(msg),表示字符串的长度(即 14 字节,包括换行符)。
第三个参数是要写入的元素个数,这里为 1,表示写入一个块。
第四个参数是目标输出流,这里是 stdout,标准输出。
printf 是一个格式化输出函数,输出字符串 "hello printf\n" 到标准输出。
fprintf 是一个格式化输出函数,功能与 printf 类似,但可以将输出写入指定的文件流。
第一个参数是目标输出流,这里为 stdout,第二个参数是待输出的字符串。
这行代码的效果与 printf 相同,即将字符串 "hello fprintf\n" 输出到标准输出。
结果展示:
stdin & stdout & stderr
C默认会打开三个输入输出流,分别是stdin, stdout, stderr
仔细观察发现,这三个流的类型都是FILE*, fopen返回值类型,文件指针
我们可以使用man手册直接在linux中查看:
总结
打开文件的方式:
r Open text file for reading. The stream is positioned at the beginning of the file.
r+ Open for reading and writing. T