06 C File
文件
文件基础
-
文本文件
文本文件中每一个字节中的数据可以被解释为一个字符的ASCII码。文本文件可以用文本编辑器打开,显示为字符串
-
二进制文件
二进制文件中每一个字节中的数据不能被解释为一个字符的ASCII码。如果用文本编辑器打开,也就是解释为ASCII码时,显示为不可读、无意义的字符串
-
文件名
文件路径表示文件在磁盘中的文件夹位置,文件名主干,文件名后缀
例:
D:\CC\temp\file1.dat -
文件结构体类型
被使用的文件在内存中有相应的文件信息区,用来存放文件相关信息(文件名、文件状态、当前读写位置等)
文件信息区是一个结构体变量,类型是FILE,包含在
stdio.h中
打开与关闭文件
访问文件步骤
-
打开文件:为文件建立相应的文件信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出的数据)
-
读写文件:以文本形式或者二进制形式读写文件中的数据
-
关闭文件:销毁文件信息区和文件缓冲区所占用的内存
打开文件
FILE* fopen(const char* filename,const char* mode)
filename 要打开的文件名 mode 文件访问模式
返回被打开的文件的指针,失败返回 NULL
FILE* fp;
if ((fp = fopen("file1", "r")) == NULL)
{
printf("cannot open this file\n");
exit(0);
}
文件访问模式
-
用
"r"方式打开的文件只能用于从该文件读数据(输入),而不能用于向该文件写数据(输出) -
用
"w"方式打开的文件只能用于向该文件写数据(输出),而不能用于从该文件读数据(输入)。如果该文件不存在,则在打开文件前建立一个以指定的名字命名的文件;如果该文件已存在,则在打开文件前将该文件删去,然后重新建立一个文件 -
用
"a"方式打开的文件用于向该文件末尾添加新的数据(不删除原有数据)。也就是说,打开文件时,文件读写标记移到文件末尾。若该文件不存在,则在打开文件前建立一个以指定的名字命名的文件 -
用
"r+""w+""a+"方式打开的文件既可以用来输入数据,也可以用来输出数据 -
二进制文件访问模式:在文本文件访问模式中加
"b"例如:
"rb+""wb+""ab"rb+"wb+""ab+"
关闭文件
int fclose(FILE * fp)
fclose(fp);
写入后应关闭文件,否则有可能丢失数据
顺序读写文件
顺序读写 对数据读写顺序和数据在文件中的物理顺序一致
文本文件
fgetc 函数
int fgetc(FILE * fp)
从fp指向的文件中读一个字符,如果成功则返回所读的字符,如果失败则返回文件结束标志EOF
fputc 函数
int fputc(int ch,FILE * fp)
把字符ch写到fp指向的文件中,如果成功则返回写入的字符,如果失败则返回文件结束标志EOF
//将文件数据逐字节复制到另一个文件
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *in, *out;
char ch, infile[10], outfile[10];
printf("Input file name:");
scanf("%s", infile);
printf("Output file name:");
scanf("%s", outfile);
if ((in = fopen(infile, "r")) == NULL) {
printf("Cannot open file\n"); exit(0); }
if ((out = fopen(outfile, "w")) == NULL) {
printf("Cannot open file\n"); exit(0); }
while (!feof(in)) {
ch = fgetc(in);
if (ch == EOF) break;
fputc(ch, out);
putchar(ch);
}
putchar('\n');
fclose(in);
fclose(out);
return 0;
}
fgets 函数
char* fgets(char* s,int n,FILE* fp)
从文件指针 fp 所指向的文件读入长度为 \(n-1\) 的字符串,并在最后加一个'\0'字符,然后存放到指针 s 所指向的内存空间中。读取失败返回 NULL
fputs 函数
int fputs(const char* s,FILE * fp)
将指针 s 指向的字符串写到文件指针 fp 所指向的文件中。成功返回 \(0\) ,否则返回非 \(0\) 值
fscanf 函数
int fscanf(FILE* fp,const char* format, 地址表列)
format 是格式字符串,如 fscanf(fp,"%d,%f",&i,&f);
fprintf 函数
int fprintf(FILE* fp,const char* format, 输出表列)
如fprintf(fp,"%d,%f",i,f);
二进制文件
fread 函数
size_t fread(void* ptr,size_t size,size_t n,FILE* fp);
二进制方式读文件,从指针fp所指向的文件中读 n 块数据,每一块的大小为 size 字节,将这些数据存储到指针ptr所指向的内存空间中
fwrite 函数
size_t fwrite(const void* ptr,size_t size,size_t n,FILE* fp);
二进制方式读文件,从指针ptr所指向的内存空间中读 n 块数据,每一块的大小为 size 字节,将这些数据存储到指针fp所指向的文件中
#include <stdio.h>
#define SIZE 10
typedef struct {
char name[10];
int num;
int age;
char addr[15];
} Student;
void save(Student *s, int n) {
FILE* fp; int i;
if ((fp = fopen("data", "wb")) == NULL) {
printf("cannot open file\n");return;}
for (i = 0; i < n; i++)
if (fwrite(&s[i], sizeof(Student), 1, fp) != 1)
printf("file write error\n");
fclose(fp);
}
int main()
{
int i;
Student s[SIZE];
printf("enter student information: \n");
for (i = 0; i < SIZE; i++)
scanf("%s%d%d%s", s[i].name, &s[i].num,
&s[i].age, s[i].addr);
save(s, SIZE);
return 0;
}
feof 函数
int feof(FILE* stream)
如果到达文件末尾,返回非零值,未到达返回 \(0\)
while(!feof(fp))
{
fscanf(fp,"%d",&i);
tot+=i;
}
随机读写文件
文件标记 用来指示接下来要读写的下一个字节的位置
rewind 函数
void rewind(FILE* fp);
使文件标记指向文件开头
fseek 函数
int fseek(FILE* fp,long offset,int whence);
使文件标记指向whence往前offset个字节(可以为负数,表示往后)的位置,其中whence的三个取值包括:0代表文件开始位置 ,1为当前位置,2为文件末尾位置
fseek (fp, 100L, 0); fseek (fp, 50L, 1);
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE* fp; char ch;
if ((fp = fopen("test.txt", "w+")) == NULL) {
printf("cannot open file\n"); exit(0);}
fputs("this is a text file.", fp);
rewind(fp);//== fseek(fp,0,0);
while ((ch = fgetc(fp)) != EOF)
putchar(ch);
fclose(fp);
return 0;
}
ftell 函数
long ftell(FILE* stream);
得到文件标记的当前位置,返回值是整数,表示相对于文件开头的偏移字节数,出错返回 \(-1\)
i = ftell(fp);
if(i==-1L)
printf("error\n");
函数总结
| 功能 | 语法 |
|---|---|
| 打开关闭文件 | fopen("test.txt","r"); fclose(fp); |
| 读写字符 | int fgetc(in); int fpotc(ch,out); |
| 读写字符串 | char* fgets(s,n,fp); int fputs(s,fp); |
| 格式化读写 | fscanf(fp,"%d%s",&n,a); fprintf(fp,"%s\n",a); |
| 检测文件末尾 | feof(); |
| 二进制读写 | size_t fread(ptr,size,n,fp); size_t fwrite(ptr,size,n,fp); |
| 随机读写 | rewind(fp); fseek(fp,offset,whence) ftell(stream); |

浙公网安备 33010602011771号