一、文本文件读写
1. int fgetc(FILE *stream);
作用:从文件中读取一个字符。(内存获取--从文件读出来)
参数:stream 是fopen的返回值。文件结构体。
返回值:如果成功获取到的字符的sacii值,如果失败返回EOF 就是-1;
请把danny.log文件的所有内容全部读取出来。
2. int fputc(int c, FILE *stream);
作用:写一个字符到文件中(内存中数据到文件中)
参数:c 是需要写入文件是字符ascii
stream 是fopen的返回值
返回值:如果成功返回写入的字符,失败返回EOF
补充: perror是打印错误信息,使用perror(字符串);
在文件中会有一个全局变量errno,记录的是最后一次的错误信息
错误信息对应一个字符串,perror会把字符串内容打印。
3. char *fgets(char *s, int size, FILE *stream);
作用: 从文件中读取一个字符串
参数:s 缓冲区,用来存放读取到的字符串。
size 大小,一次性读取的字符个数
stream :fopen的返回值
返回值:如果成功返回读取到的字符首地址,如果失败返回NULL
注意:实际读取到的字符是size-1个,会自动在后面加‘\0’;
4.int fputs(const char *s, FILE *stream);
作用:写入字符串到文件中
参数: s 需要写入的字符串首地址
stream:fopen的返回值
返回值:如果成功返回实际写入文件的字符个数,失败返回EOF
注意:写入的时候不会把字符串的'\0'写入到文件中
5. 在文件内部,有一个专门处理光标位置的指针,文件偏移指针
6.int fseek(FILE *stream, long offset, int whence);
功能:移动文件偏移指针到指定位置,
参数: offset:偏移多少字节,负数则往左偏移,整数往右偏移
whence: SEEK_SET 从文件头开始
SEEK_CUR 从当前位置开始
SEEK_END 从文件末尾开始
7. 函数原型:long ftell(FILE *stream);
功能:返回文件偏移指针位置
参数:fopen的返回值
返回值:光标所在位置,文件偏移指针位置。
8.void rewind(FILE *stream);
作用:把文件光标移动在文件头
参数:fopen返回值
返回值:无
练习:请写代码,把abc.log文件复制一份到abc-bak.log中(day08/copyfile.c)
9.int feof(FILE *stream);
作用:判断文件是否结束
参数: 文件结构体指针 fopen返回值
返回值:如果文件结束返回真,如果文件未结束返回假(0)
注意:错误信息保存在errno,可以用perror打印、
10. size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
作用:读二进制文件到内存中
参数: ptr 是缓冲区,用来存放读取的二进制内容,
size 每一块的大小
nmemb:读的块数,总共读取几块,总大小是size* nmemb
stream : 文件的结构体指针,fopen的返回值
返回值:实际读取到的块个数。小于等于nmemb的值。
11.size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
作用:写入二进制到文件
参数: ptr 是缓冲区,用来存放写入文件的内容,
size 写入每一块的大小
nmemb:写的块数,总共写入几块,总大小是size* nmemb
stream : 文件的结构体指针,fopen的返回值
返回值:实际写入文件的个数。小于等于nmemb的值。
12.int fscanf(FILE *stream, const char *format, ...); (自学内容)
作用:读取文件内容到内存中
参数:stream 文件指针 fopen返回值
format 格式化处理字符串
while(fscanf(fp,"%d %s %s %d %d %d %d %d",&W[i].id,W[i].name,W[i].sex,&W[i].age,&W[i].chinese,&W[i].math,&W[i].english,&W[i].sum)!=EOF)
{
i++;
}
13. int fprintf(FILE *stream, const char *format, ...); (自学内容)
作用:写入内容到文件中
参数:stream 文件指针 fopen返回值
format 格式化处理字符串
// fprintf(fp,"学号\t 姓名\t 性别\t 年龄\t 语文成绩\t 数学成绩\t 英语成绩\t 总成绩\n");
for(i=0;i<a;i++)
{
fprintf(fp,"%d\t\t %s\t %s\t\t %d\t\t %d\t\t\t %d\t\t %d\t\t %d\n",W[i].id,W[i].name,W[i].sex,W[i].age,W[i].chinese,W[i].math,W[i].english,W[i].sum);
}
fclose(fp);
练习: 在文件中写入3个结构体,结构体中有id age和name,请把读取到的所有name写入到另外一个文件中。把文化a中所有学生信息的名字提取出来放入文件 b中
预习: 排序算法,查找算法,冒泡,二分,快速,选择,插入,桶排序,基数排序。