- (1)
rewind
:函数把文件内部位置指针移到文件首; - (2)
fseek
:移动文件流的读写位置;
1. 字符读写函数 :fgetc和fputc
在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。
在文件内部有一个位置指针。用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc 函数后, 该位置指针将向后移动一个字节。 因此可连续多次使用fgetc函数,读取多个字符。 应注意文件指针和文件内部的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。
FILE *fp
assert(fp = fopen("", "rb"));
char ch;
ch = fgetc(fp);
while (ch != EOF){
putchar(ch);
// 屏幕上显示
ch = fgetc(fp);
}
// #define EOF (-1)
assert(fp = fopen("", "wt+"));
printf("input a string: \n");
char ch;
ch = getchar();
while (ch != '\n'){
fputc(ch, fp);
ch = getchar();
}
一个小案例
把命令行参数中的前一个文件名标识的文件, 复制到后一个文件名标识的文件中, 如命令行中只有一个文件名则把该文件写到标准输出文件(显示器)中。
typedef FILE* FP;
FP fp1, fp2;
assert(fp1 = fopen(argv[1], "rb"));
if (argc == 2) fp2 = stdout;
else fp2 = fopen(argv[2], "wt+");
char ch;
while ((ch = fgetc(fp1)) != EOF)
fputc(ch, fp2);
fclose(fp1);
fclose(fp2);
2. 字符串读写函数:fgets和fputs
读字符串函数 fgets
函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为:
fgets(字符数组名, n, 文件指针);
其中的 n 是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'\0'
。例如:fgets(str,n,fp);
的意义是从fp
所指的文件中读出n-1个字符送入字符数组str
中。
FILE *fp;
char str[11];
assert(fp = fopen("....", "rb"));
fgets(str, 11, fp);
// 只传递 10 个元素,第11个为 '\0',标识结束
3. 数据块读写函数:fread和fwrite
fread(buffer,size,count,fp);
// size 表示字节数
// count 数据块块数
fwrite(buffer,size,count,fp);
fread(fa,4,5,fp);
其意义是从fp
所指的文件中,每次读 4 个字节(一个实数)送入实数组fa
中,连续读 5 次,即读 5 个实数到 fa 中。
实现如下功能:从键盘输入两个学生数据,写入一个文件中, 再读出这两个学生的数据显示在屏幕上。
struct Stu{
int id;
char name[10];
int age;
char addr[12];
} boys[2], copy[2], *pp, *qq;
pp = boys; qq = copy;
FILE *fp;
assert(fp = fopen("...", "wt+"));
int i;
for (i = 0; i < 2; ++i, ++pp)
scanf("%d %s %d %s", &pp->id, pp->name, &pp->age, pp->addr);
pp = boys;
fwrite(pp, sizeof(struct Stu), 2, fp);
rewind(fp);
fread(qq, sizeof(struct Stu), 2, fp);
for (i = 0; i < 2; ++i, ++qq)
printf("id: %d, name: %s, age: %d, addr: %s\n", qq->id, qq->name, qq->age, qq->addr);
fclose(fp);
4. 格式化读写函数:fscanf和fprinf
fscanf 函数,fprintf 函数与前面使用的 scanf 和 printf 函数的功能相似,都是格式化读写函数。 两者的区别在于 fscanf 函数和fprintf 函数的读写对象不是键盘和显示器,而是磁盘文件。这两个函数的调用格式为: fscanf(文件指针,格式字符串,输入表列); fprintf(文件指针,格式字符串,输出表列); 例如:
fscanf(fp, "%d %s", &i, s);
fprintf(fp, "%d %c", j, ch);
struct Stu{
int id;
char name[10];
int age;
char addr[20];
} boys[2], copy[2], *pp, *qq;
pp = boys; qq = copy;
FILE *fp;
assert(fp = fopen("...", "wt+"));
// 从控制台格式化输入到结构体
int i;
for (i = 0; i < 2; ++i, ++pp)
scanf("%d %s %d %s", &pp->id, pp->name, &pp->age, pp->addr);
pp = boys;
// 格式化输出到文件
for (i = 0; i < 2; ++i, ++pp)
fprintf(fp, "%d %s %d %s\n", pp->id, pp->name, pp->age, pp->addr);
rewind(fp);
// 从文件格式化输出到结构体
for (i = 0; i < 2; ++i, ++qq)
fscanf(fp, "%d %s %d %s", &qq->id, qq->name, &qq->age, qq->addr);
qq = copy;
// 从结构体输出到控制台
for (i = 0; i < 2; ++i, ++qq)
printf("%d %s %d %s\n", qq->id, qq->name, qq->age, qq->addr);
fclose(fp);