一直没有系统学习过该章节,现参考《C语言程序设计 (第四版)谭浩强》
C文件基本知识
什么是文件



文件名

文件的分类


文件缓冲区

文件类型指针

typedef struct
{
short level; // 缓冲区“满”或“空”的程度
unsigned flags; // 文件状态标志
char fd; // 文件描述符
unsigned char hold; // 如缓冲区无内存不读取字符
short bsize; // 缓冲区的大小
unsigned char* buffer; // 数据缓冲区的位置
unsigned char* curp; // 指针当前的指向
unsigned istemp; // 临时文件指示器
short token; // 用于有效性检查
};FILE


文件打开与关闭

fopen




if ((fp = fopen("lena.bmp", "r")) == NULL)
{
printf("不能打开文件!
");
exit(0); // 关闭所有文件,终止正在执行的程序,待用户检查出错误后,修改后重新运行z
}

fclose

![]()
顺序读写数据文件

如何向文件中读写一个字符


#include <stdio.h>
#include <windows.h>
int main()
{
FILE* fp = NULL;
char ch, filename[10];
printf("请输入文件名:");
scanf("%s", filename);
if ((fp = fopen("filename", "w")) == NULL)
{
printf("不能打开文件!
");
exit(0);
}
ch = getchar(); // 每次接收一个字符
while (ch != '#') // 当输入#时结束循环
{
fputc(ch, fp); // 向磁盘文件中输出一个字符
putchar(ch); // 将输出的字符显示在屏幕上
ch = getchar(); //继续接收输入的字符
}
fclose(fp);
putchar(10); // 想屏幕输出换行符
return 0;
}
![]()
#include <stdio.h>
#include <windows.h>
void main()
{
FILE *in,*out;
char ch,infile[10],outfile[10];
printf("请输入读入的文件名:");
scanf("%s", infile);
printf("请输入输出的文件名:");
scanf("%s", outfile);
if ((in = fopen(infile, "r")) == NULL)
{
printf("不能打开文件!
");
exit(0);
}
if ((out = fopen(outfile, "w")) == NULL)
{
printf("不能打开文件!
");
exit(0);
}
while (!feof(in)) // feof(in)检查in所指向的文件是否结束,feof:检查到文件读写位置标记是否移动到文件的末尾
{
ch = fgetc(in); // 从输入文件中读入一个字符,暂时存放在ch
fputc(ch, out); //将ch输出到文件中
putchar(ch); //将字符显示在屏幕上
}
putchar(10); // 想屏幕输出换行符
fclose(in);
fclose(out);
}
补充:
1、以上程序是按文本文件方式处理的,也可以用此程序来复制一个二进制文件,只需将fopen函数中的参数换为:“rb”和“wb”
2、C系统将fputc和fgetc函数定义为宏名putc和getc:

如何向文件中读写一个字符串


#include <stdio.h>
#include <windows.h>
#include <string.h>
void main()
{
FILE* fp;
char str[3][10], temp[10]; // str存放字符串的二维数组,temp是临时数组
int i, j, k, n = 3;
printf("请输入字符串:
");
for (i = 0; i < n; i++)
{
gets(str[i]); // 输入字符串
}
for (i = 0; i < n - 1; i++) // 选择法对字符串进行排序
{
k = i;
for (j = i + 1; j < n; j++)
{
if (strcmp(str[k], str[j]) > 0) // strcmp:按字母大小比较两个字符串,相同返回0,否则返回1
k = j;
}
if (k != i)
{
strcpy(temp, str[i]); // strcpy:复制字符串
strcpy(str[i], str[k]);
strcpy(str[k], temp);
}
}
if ((fp = fopen("s.txt", "w")) == NULL)
{
printf("不能打开文件!
");
exit(0);
}
printf("新的序列为:
");
for (i = 0; i < n; i++)
{
fputs(str[i], fp); // 向文件中写入一个字符串,然后输出一个换行符
fputs("
", fp);
printf("%s
", str[i]);
}
}
格式化方式读写文件


二进制方式向文件读写一组数据

随机读写数据文件

文件位置标记及其定位
1、文件位置标记


2、文件位置标记的定位


#include <stdio.h>
#include <windows.h>
#include <string.h>
void main()
{
FILE* fp1, * fp2;
fp1 = fopen("pam.txt", "r"); //打开输入文件
fp2 = fopen("s.txt", "w"); // 打开输出文件
while (!feof(fp1))
{
putchar(getc(fp1)); // 逐个读入字符输出到屏幕上
}
putchar(10);
rewind(fp1); // 使文件位置标记返回文件头
while (!feof(fp1))
{
putc(getc(fp1), fp2); // 从文件头重新逐个读字符,输出到另外一个文件中
}
fclose(fp1);
fclose(fp2);
}

vfgrt67
随机读写的出错检测
ferror


clearerr
