目录
二进制文件和文本文件
二进制文件:不加转换输出到外存的文件中
文本文件:以ASCII字符形式存储的文件
字符一律以ASCII形式存储,数值型数据可以用ASCII形式存储,也可以使用二进制形式存储
文件的打开和关闭
文件在读写之前要打开文件,读写完成之后要关闭文件
//打开文件
FILE*fopen(const char*filename,const char *mode);
//filename 是文件名 mode 是打开方式
//关闭文件
fclose(FILE*stream);
文件打开方式
文件使用方式 | 含义 | 如果指定文件不存在 |
“r”(只读) | 为了输入数据,打开一个已经存在的文件 | 出错 |
“w”(只写) | 为了输入数据,打开一个文本文件 | 建立一个新的文件 |
“a”(追加) | 向文本末尾添加数据 | 建立一个新的文件 |
“rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
“wb”(只写) | 为了输入数据,打开一个二进制文件 | 建立一个新的文件 |
“ab”(追加) | 向一个二进制文件尾添加数据 | 建立一个新的文件 |
“r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
“w+”(读写) | 为了读和写,建立一个新的文件 | 建立一个新的文件 |
“a+”(读写) | 打开一个文件,在文件末尾进行读写 | 建立一个新的文件 |
“rb+”(读写) | 为了读和写,打开一个二进制文件 | 出错 |
“wb+”(读写) | 为了都读和写,新建立一个二进制文件 | 建立一个新的文件 |
“ab+”(读写) | 打开哟个二进制文件,在文件末尾进行读写 | 建立一个新的文件 |
int main()
{
FILE*pf=fopen("test.txt","w");
if(pf==NULL)
{
perror("wrong");
return 1;
}
else
fput("hello",pf);
fclose(pf);
pf=NULL;
return 0;
}
文件读写函数
函数名 | 功能 | 适用范围 |
fgetc | 字符输入函数 | 所有输入流 |
fputc | 字符输出函数 | 所有输入流 |
fgets | 文本行输入函数 | 所有输入流 |
fputs | 文本行输出函数 | 所有输入流 |
fscanf | 格式化输入函数 | 所有输入流 |
fprintf | 格式化输出函数 | 所有输入流 |
fread | 二进制输入 | 文件 |
fwrite | 二进制输出 | 文件 |
fputc
int fputc ( int character, FILE * stream );如果成功读取字符则返回字符的ASCII码值
如果读取失败或者遇到文件末尾则返回EOF
int main()
{
int a = 1000;
FILE* pf = fopen("test.txt", "wb");
fputc('a', pf);
fclose(pf);
pf = NULL;
return 0;
}
fgetc
int fgetc ( FILE * stream );如果成功读取字符则返回字符的ASCII码值
如果读取失败或者遇到文件末尾则返回EOF
int main()
{
int a = 1000;
FILE* pf = fopen("test.txt", "w");
char ch = 0;
if (pf == NULL)
{
perror("wrong!");
return 1;
}
for (ch = 'a'; ch <= 'z'; ch++)
{
fputc(ch, pf);
}
fclose(pf);
FILE* p = fopen("test.txt", "r");
if (p == NULL)
{
perror("wrong!");
return 1;
}
int aa=0;
while ((aa = fgetc(p)) != EOF)
{
printf("%c ", aa);
}
fclose(p);
p = NULL;
return 0;
}
fputs
int fputs ( const char * str, FILE * stream );该函数开始从指定的地址 (str) 进行复制,直到到达终止空字符 ('\0')。该终止空字符不会复制到流中。
int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("wrong!");
return 1;
}
fputs("hello world", pf);
fclose(pf);
pf = NULL;
return 0;
}
fgets
char * fgets ( char * str, int num, FILE * stream );
实际上为num-1个,因为‘\0’自动补上(如果字符串长度大于num则在第num个位置上放上‘\0’,如果字符串长度小于num则不够的位置不上‘\0’)
只会读取一行不会跨行读取
读取遇到文件末尾或者有误则返回空指针
一行太长仍然可以打印出来(拆成多次打印)
实际上为num-1个,因为‘\0’自动补上例子
int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("wrong!");
return 1;
}
fputs("hello world", pf);
fclose(pf);
FILE* p = fopen("test.txt", "r");
if (p == NULL)
{
perror("wrong!");
return 1;
}
char arr[10] = { 0 };
fgets(arr, 5, p);
printf("%s", arr);
fclose(p);
p = NULL;
return 0;
}
只会读取一行不会跨行读取例子
int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("wrong!");
return 1;
}
fputs("hello world\n", pf);
fputs("pretty good!\n", pf);
fclose(pf);
FILE* p = fopen("test.txt", "r");
if (p == NULL)
{
perror("wrong!");
return 1;
}
char arr[15] = { 0 };
fgets(arr, 15, p);
printf("%s", arr);
fclose(p);
p = NULL;
return 0;
}
一行太长仍然可以打印出来例子
int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("wrong!");
return 1;
}
fputs("hello worldhhhhhhhhhhhhhhhhhhh\n", pf);
fputs("pretty good!\n", pf);
fclose(pf);
FILE* p = fopen("test.txt", "r");
if (p == NULL)
{
perror("wrong!");
return 1;
}
char arr[15] = { 0 };
while (fgets(arr, 15, p) != NULL)
{
printf("%s", arr);
}
fclose(p);
p = NULL;
return 0;
}
fprintf
int fprintf ( FILE * stream, const char * format, ... );
struct s {
char name[20];
int age;
};
int main()
{
struct s ss = { "zhangsan",18 };
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("wrong");
return 1;
}
fprintf(pf, "%s,%d", ss.name, ss.age);
fclose(pf);
pf = NULL;
return 0;
}
fscanf
int fscanf ( FILE * stream, const char * format, ... );
int main()
{
struct s sa = { 0 };
FILE* p = fopen("test.txt", "r");
if (p == NULL)
{
perror("wrong");
return 1;
}
fscanf(p, "%s %d", sa.name, &(sa.age));
printf("%s %d", sa.name, sa.age);
fclose(p);
p = NULL;
return 0;
}
fwrite
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
int main()
{
int a[5] = { 1,2,3,4,5 };
FILE* pf = fopen("test.txt", "wb");
if (pf == NULL)
{
perror("wrong!");
return 1;
}
fwrite(a, 4, 5, pf);
fclose(pf);
pf = NULL;
return 0;
}
fread
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
int main()
{
int a[5] = { 0 };
FILE* pf = fopen("test.txt", "rb");
if (pf == NULL)
{
perror("wrong!");
return 1;
}
fread(a, 4, 5, pf);
int i = 0;
for (int i = 0; i < 5; i++)
{
printf("%d", a[i]);
}
fclose(pf);
pf = NULL;
return 0;
}
文件随机读写
1.fseek
int fseek ( FILE * stream, long int offset, int origin );
int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("wrong!");
return 1;
}
fputs("pretty good guys", pf);
fseek(pf, 12, SEEK_SET);
fputs("girl", pf);
fclose(pf);
pf = NULL;
return 0;
}
2.ftell
long int ftell ( FILE * stream );返回⽂件指针相对于起始位置的偏移量
int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("wrong!");
return 1;
}
fputs("hello world", pf);
fclose(pf);
FILE* p = fopen("test.txt", "r");
fseek(pf, 4, SEEK_SET);
long size;
size = ftell(p);
printf("%d", size);
fclose(p);
p = NULL;
return 0;
}
3.rewind
void rewind ( FILE * stream );让⽂件指针的位置回到⽂件的起始位置
int main()
{
int n;
char buffer[27];
FILE* pf = fopen("test.txt", "w+");
for (n = 'a'; n <= 'z'; n++)
fputc(n, pf);
rewind(pf);
fread(buffer, 1, 26, pf);
fclose(pf);
pf = NULL;
buffer[26] = '\0';
puts(buffer);
return 0;
}
文件读取结束判定
1. ⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
2. ⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。(fread判断返回值是否⼩于实际要读的个数)
注意 :不能用feoF判断是否是文件末尾
因为文件读取结束有两个原因:1.遇到文件末尾(feof) 2.读取发生错误(ferror)
文本文件例子
int main()
{
int c;
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("wrong!");
return 1;
}
while ((c=fgetc(pf))!= EOF)
{
putchar(c);
}
printf("\n");
if (ferror(pf))
{
printf("I / O error when reading");
}
else if (feof(pf))
{
printf("End of file reached successfully");
}
fclose(pf);
pf = NULL;
return 0;
}
二进制文件例子
int main()
{
int a[5] = { 1,2,3,4,5 };
FILE* pf = fopen("test.txt", "wb");
if (pf == NULL)
{
perror("wrong!");
return 1;
}
fwrite(a, 4, 5, pf);
fclose(pf);
pf = fopen("test.txt", "rb");
int b[5];
if (pf == NULL)
{
perror("wrong!");
return 1;
}
size_t aa=fread(b, 4, 5, pf);
if (aa == 5)
{
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%d", b[i]);
}
}
else if (ferror(pf))
{
perror("Error reading test.txt");
}
else if (feof(pf))
{
printf("Error reading test.txt: unexpected end of file\n");
}
fclose(pf);
pf = NULL;
return 0;
}