文件
- 打开文件
FILE *fp;
fp = fopen("test.txt", "r");
if (fp == NULL)
{
exit(0);
}
文本文件
r 只读 r+ 读写
w 只写 w+ 读写
a+ 读写尾部添加
二进制文件
rb 只读 rb+ 读写
wb 只写 wb+ 读写
ab 尾部添加 ab+ 读写尾部添加
- 关闭文件
fclose(fp);
- 字符方式的读写文件
char ch;
ch = getchar();
while ( ch != '$' )
{
fputc(ch,fp);
ch = getchar();
}
ch = fgetc(fp);
while ( ch != EOF )
{
putchar(ch);
ch = fgetc(fp);
}
putchar(10);
- 字符串读写文件
char ch[41], *cp;
cp = fgets(ch, 41, fp);
while ( cp != NULL )
{
printf("%s", ch);
cp = fgets(ch, 40, fp);
}
char ch[5][41], *cp;
int i;
for ( i = 0; i < 0; i++ )
{
gets(ch[i]);
}
for ( i = 0; i < 5; i++ )
{
fputs(ch[i], fp);
fputs("\n", fp);
}
- 格式化方式读写文件
fscanf() 把从文本文件中读出的字符串按指定的格式转换为相应类型变量的值(不只是字符型)
fprintf() 把变量的值按指定的方式转化为文本写往文本文件
fscanf(文本指针,格式控制字符串,输入项的地址列表);
其返回值是事实上已赋值的变量的个数,如果未进行分配,则返回EOF
fprintf(文本指针,格式控制字符串,输入项的列表);
其返回值是正确写入文件的字节数,否则返回负数
int main(void)
{
char name[9];
FILE *fp;
int age, i, num=0;
float score;
fp = fopen("student.txt", "w");
if ( fp == NULL )
exit(0);
for ( i = 0; i < 3; i++ )
{
printf("请输入学生_%d的姓名,年龄,成绩:", i+1);
scanf("%s%d%f", name, &age, &score);
fprintf(fp, "%s %4d %6.2f\n", name, age, score);
}
fclose(fp);
fp = fopen("student.txt", "r");
printf("从文件中读出的学生数据:\n");
i = fscanf(fp, "%s%d%f", name, &age, &score);
while ( i == 3 )
{
printf("学生_%d的姓名,年龄,成绩:", ++num);
printf("%s %4d %6.2f\n", name, age, score);
i = fscanf(fp, "%s%d%f", name, &age, &score);
}
fclose(fp);
return 0;
}
- 数据块读写文件
数据块读写文件在读写过程中不对数据进行转换,直接在内存与文件之间进行数据拷贝;
读写过程中不需考虑数据的性质和类型,只是简单对存储空间进行复制
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
buffer:对应一个连续内存数据区的起始地址,通常是一个指针值
size:欲复制的一个数据块的大小(字节数)
count:本次欲复制多少个数据块
fp:指向读写文件的文件指针
int feof(FILE *fp)
用于在进行读文件时,检测是否读写文件所有数据,如果文件结束,则返回非0值,反之返回0
while (!feof(fp)) {}
int main(void)
{
FILE *fp1, *fp2;
char data;
fp1 = fopen("stu.txt", "rb");
fp2 = fopen("stu_copy.txt", "wb");
if ( fp1 == NULL || fp2 == NULL )
exit(0);
fread(&data, sizeof(char), 1, fp1);
while ( !feof(fp1) )
{
fwrite(&data, sizeof(char), 1, fp2);
fread(&data, sizeof(char), 1, fp1);
}
fclose(fp1);
fclose(fp2);
return 0;
}
- 文件的其他操作
fseek(),可以将文件位置指针移动到指定的位置
int fseek(FILE *fp,long 位移量, int 起始点);
起始点参数:0 文件开始位置; 1 文件当前位置; 2 文件末尾位置
位移量: 值为正时,指针向后移动;值为负时,指针向前移动;若是long型,则100L
rewind(FILE *fp) 是使文件的文件位置指针重新指向文件开始的位置
fflush(stdin); 清空输入缓存区,保证下面的scanf()读新的循环条件
ftell(FILE *fp) 用于获取文件位置指针当前值
ferror(FILE *fp) 用于测试给定文件指针指向的文件信息区的错误标识符
cleareer(FILE *fp) 使文件错误标志和文件结束标志置为0