文件输入/输出
与文件通信
文件通常是在磁盘或固态硬盘上的一段已命名的存储区。
fopen()的模式字符串
模式字符串 | 含义 |
---|---|
“r” | 以读模式打开文件 |
“w” | 以写模式打开文件,把现有文件的长度截为0,如果文件不存在,则创建一个新文件 |
“a” | 以写模式打开文件,在现有文件末尾添加内容,如果文件不存在,则创建一个新文件 |
“r+” | 以更新模式打开文件(即可以读写文件) |
“w+” | 以更新模式打开文件(即读写),如果文件存在,则将其长度截为0;如果文件不存在,则创建一个新文件 |
“a+” | 以更新模式打开文件(即读写),在现有文件的末尾添加内容,如果文件不存在,则创建一个新文件 |
“rb”、“wb”、“ab”、“ab+”、“a+b”、“wb+”、“w+b”、“ab+”、“a+b” | 与上一个模式类似,但是以二进制模式而不是文本模式打开文件 |
“wx”、“wbx” 、“w+x”、“wb+x"或"w+bx” | (C11)类似非 x模式,但是如果文件已存在或以独占模式打开文件,则打开文件失败 |
1.1 文件模式
C提供两种文件模式:文本模式和二进制模式。
二进制模式:在二进制模式中,程序可以访问文件的每个字节。
文本模式:文本模式中,程序所见的内容和文件的实际内容不同,程序以文本模式读取文件时,把本地环境表示的行末尾或文件结尾映射为 C模式。
2.2 文件相关操作函数
fopen(filename, type): 第一个参数是文件路径和文件名,第二个参数是读取模式。
getc():从标准输入中获取一个字符。
putc(ch, fpout): 第一个参数是待写入的字符,第2个参数是文件指针。
读取到文件结尾,将返回一个特殊值 EOF.
fclose(fp)函数 关闭 fp 指定的文件,必要时刷新缓冲区。成功关闭 fclose()函数返回0,否则返回 EOF.
int ungetc(int c, FILE *fp)函数把 c指定的字符放回输入流中,
int fflush(FLLE *fp)函数引起输出缓冲区中所有的未写入数据被发送到 fp 指定的输出文件,这个过程称为刷新缓冲区。
int setvbuf( FILE *restrict fp, char * restrict buf, int mode, size_t size)函数创建了一个供标准 I/O 函数替换使用的缓冲区。再打开文件后且未对流进行其他操作之前,调用该函数,指针 fp 识别待处理的流,buf 指向待使用的存储区。如果 buf 的值不是 NULL,则必须创建一个缓冲区。变量 size 告诉 setvbuf()数组的大小。mode的选择如下:_IOFBF 表示完全缓冲(在缓冲区满时刷新);_IOLBF表示行缓冲(在缓冲区满时或写入一个换行符时);_IONBF 表示无缓冲,如果操作成功函数返回0,否则返回一个非零值。
2. 二进制 I/O:fread()和 fwrite()
size_t fwirte(const void * restrict ptr, size_t size, size_t nmemb, FILE * restrict fp);把二进制数据写入文件。ptr 是待写入数据块的地址(需固定大小如:har s[1024])。size 表示待写入数据块的大小(以字节为单位),nmemb 表示待写入数据块的数量。fp指定待写入的文件。函数返回成功写入数据块的数量。
size_t fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict fp);参数同上
getc(FILE *fp),从 fp 指定的文件中获取一个字符。
putc(char *ch, FILE *fpout)第一个参数是待写入的字符,第二个参数是文件指针。
通常,输入函数 getc()、fgets()、fscanf()、fread()都从文件开始处按顺序读取文件。然而,fseek()和 ftell()把类似的功能扩展至更大的文件,与文件模式相比,二进制模式更容易进行随机访问。
#### 简单的例子
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void writefile();
int main()
{
writefile();
return 0;
}
void writefile()
{
char *hello = "test write and fread funciton";
char w[12];
FILE *file = fopen("test.txt", "r+");
if (file != NULL)
{
size_t a = fwrite(hello, 1, 120, file);
if (a > 0)
{
printf("写入的数据量为=%ld", a);
}
else
{
printf("写入失败");
}
size_t b = fread(w, sizeof(char), 12, file);
if (b > 0)
{
printf("读取成功%ld w = %s", b, w);
}
else
{
printf("读取失败%zu", b);
}
fclose(file);
}
else
{
printf("打开文件失败");
}
}