上一节的课后作业:
作业: 写一个load()函数将该文件读取并显示出来! 聪明如你,认真思考一定能做到的!
#include <stdio.h>
#define SIZE 4
struct student
{
char name[10];
int num;
int age;
char addr[15];
}stu[SIZE];
void load();
void main()
{
int i;
load();
printf(" name num age address\n\n");
for (i = 0; i < SIZE; i++)
{
printf("%10s %5d %5d %10s\n", stu[i].name, stu[i].num, stu[i].age, stu[i].addr);
}
}
// 作业: 写一个load()函数将该文件读取并显示出来! 聪明如你,认真思考一定能做到的!
void load()
{
FILE *fp;
int i;
if (!(fp = fopen("student-list", "r")))
{
printf("Cannot open the file!\n");
return;
}
for (i = 0; i < SIZE; i++)
{
fread(&stu[i], sizeof(struct student), 1, fp);
}
fclose(fp);
}
三.格式化读写函数(fprintf()和fscanf())
函数调用:
fprintf ( 文件指针,格式字符串,输出表列);
fscanf ( 文件指针,格式字符串,输入表列);
函数功能:
从磁盘文件中按格式读入或输出字符。
例如:
fprintf(fp, "%d,%6.2f", i, t);
fscanf (fp, "%d,%f", &i, &t);
顺序读写和随机读写
顺序读写:
位置指针按字节位置顺序移动。
随机读写:
读写完上一个字符(字节)后,并不一定要
读写其后续的字符(字节),而可以读些文
件中任意位置上所需要的字符(字节)。
fseek函数(一般用于二进制文件)
函数功能:
改变文件的位置指针
函数调用形式:
fseek(文件类型指针,位移量,起始点)
起始点:
文件开头 SEEK_SET 0
文件当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
位移量:以起始点为基点,向前移动的字节数。
fseek函数应用举例
fseek(fp,100L,0);
将位置指针移到离文件头100个字节处
fseek(fp,50L, 1);
将位置指针移到离当前位置50个字节处
fseek(fp,50L, 2);
将位置指针从文件末尾处向后退10个字节
fseek(fp,i*sizeof(struct stu),0);
将位置指针移到离文件头i*sizeof(struct stu)这个距离处。
举例论证
例子:
在学生文件student-list中读出第二个学生的数据。
#include <stdio.h>
#include <stdlib.h>
struct student
{
char name[10];
int num;
int age;
char addr[15];
}boy;
void main()
{
FILE *fp;
int i = 1; // 用于定位第 i 个结构
if (!(fp = fopen("student-list", "r")))
{
printf("Cannot open the file!\n");
return;
}
rewind(fp); //重置文件头
fseek(fp, i*sizeof(struct student), 0); //定位要读取的位置
fread(&boy, sizeof(struct student), 1, fp); //读取
printf("name\tnumber age addr\n");
printf("%s\t%5d %7d %s\n", boy.name, boy.num, boy.age, boy.addr);
system("pause");
}
ftell函数
函数作用:
得到流式文件中的当前位置,用相对于文件开
头的位移量来表示。
返回值:
返回当前位置,出错时返回-1L。
应用举例:
i = ftell(fp);
if(i == -1L) printf(“error\n”);
出错的检测
ferror函数
调用形式:
ferror(fp);
返回值:
返回0,表示未出错;返回非0,表示出错。
注意:
在调用一个输入输出函数后立即检查ferror函
数的值,否则信息会丢失。在执行fopen函数
时,ferror函数的初始值自动置为0。
clearerr函数
调用形式:
clearerr(fp);
函数作用:
使文件错误标志和文件结束标志置为0。
只要出现错误标志,就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数。
文件操作小结
分类 | 函数名 | 功能 |
打开文件 | fopen() | 打开文件 |
关闭文件 | fclose() | 关闭文件 |
文件定位 | fseek() | 改变文件位置指针的位置 |
| rewind() | 使文件位置指针重新至于文件开头 |
| ftell() | 返回文件位置指针的当前值 |
文件状态 | feof() | 若到文件末尾,函数值为真 |
| ferror() | 若对文件操作出错,函数值为真 |
| clearerr() | 使ferror和feof()函数值置零 |
文件读写 | fgetc(),getc() | 从指定文件取得一个字符 |
| fputc(),putc() | 把字符输出到指定文件 |
| fgets() | 从指定文件读取字符串 |
| fputs() | 把字符串输出到指定文件 |
| getw() | 从指定文件读取一个字(int型) |
| putw() | 把一个字输出到指定文件 |
| fread() | 从指定文件中读取数据项 |
| fwrite() | 把数据项写到指定文件中 |
| fscanf() | 从指定文件按格式输入数据 |
| fprintf() | 按指定格式将数据写到指定文件中 |