操作文件之前必须先打开文件,打开文件就是让程序和文件建立连接的过程。
函数声明:
FILE *fopen(const char *filename, const char *mode):以mode的形式打开filename指向的文件。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream):向stream指向的文件写入ptr指向的数据,size是一个元素几个字节,nmemb是几个元素(一个元素的大小是size)。
int fclose(FILE *stream):关闭stream指向的文件。
实例:
int a = 10000;
FILE* pf = fopen("test.txt", "wb");
fwrite(&a, 4, 1, pf);//写入a,4个字节,一个数据,写入到pf指向的文件
fclose(pf);
pf = NULL;
文件名包括三部分:文件路径+文件名主干+文件后缀,例如:c:\code\test.txt。绝对路径:E:\C++\likou_c\WenJian\WenJian\test.txt.使用两个斜杠,一个斜杠是转义字符。没有文件会创建文件,“wb”:w是写入,b是二进制:以二进制的形式写入。后面如果不使用文件了,要关闭文件。二进制文件用记事本打开是乱码,可以使用vs打开。源文件->添加现有项->右击选择打开方式->二进制编译器
读写操作:
FILE* pfw = fopen("test1.txt", "w");
if (pfw == NULL)
{
printf("%s\n", strerror(errno));
}
else
{
fputc('a', pfw);//写入一个字符
fputc('b', pfw);
fputc('c', pfw);
fclose(pfw);
pfw = NULL;
}
FILE* pfr = fopen("test1.txt", "r");
if (pfr == NULL)
{
printf("%s\n", strerror(errno));
}
else{
printf("%c ", fgetc(pfr));//读出一个字符
printf("%c ", fgetc(pfr));
printf("%c ", fgetc(pfr));
fclose(pfr);
pfr = NULL;
}
会自动创建text1.txt文件,并写入abc。
实例中如果pfr等于空,printf("%s\n", strerror(errno))。这一句是在打开失败或者没有文件时打印错误信息,具体是什么错误没有打开文件,比如在没有text1.txt文件时,以读的方式打开文件就是报错。
输入输出流:
键盘:标准输入设备 - stdin
屏幕:标准输出设备 - stdout
这两个是一个程序默认打开的两个流设备
char in = fgetc(stdin);
fputc(in, stdout);
使用fgetc操作键盘的输入流,可以直接使用键盘输入(一个字符),使用fputc操作屏幕的输出流,可以直接在屏幕上输出。
fgets:读取一行文本
char* fgets(char* string, int n, FILE* stream);string:存储位置,n:读取长度,stream:读取的文件流
char buf[1024] = { 0 };
fgets(buf, 1024, pf);
puts(buf);//输出buf
fputs:输入一行文本
fputs("hello\n",pf);输出hello到pf指向的文件流。
键盘输入一行屏幕输出一行:
char buf[1024] = { 0 };
fgets(buf, 1024, stdin);
fputs(buf, stdout);
或者
gets(buf);
puts(buf);
- scanf/printf: 是针对标准输入流/标准输出流的格式化输入/输出语句
- fscanf/fprintf: 是针对所有输入流/所有输出流的格式化输入/输出语句
- sscanf/sprintf: sscanf是从字符串中读取格式化的数据;sprintf是把格式化数据输出成(存储到)字符串
//fprintf:输入有格式的文本
struct S s = { 100,3.14,"bit" };
fprintf(pf, "%d %f %s", s.n, s.f, s.arr);
//fscanf:读取有格式的文本
fscanf(pf, "%d %f %s", &(s.n), (s.f), s.arr)
struct S s = { 100, 3.14f, "abcdef" };
char buf[1024] = { 0 };
sprintf(buf, "%d %f %s", s.n, s.f, s.arr);
printf("%s\n", buf);
struct S tmp = { 0 };
sscanf(buf, "%d %f %s", &(tmp.n), &(tmp.f), &(tmp.arr));
printf("%d %f %s\n", tmp.n, tmp.f, tmp.arr);