上一節的課後作業:
作業: 寫一個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() |
按指定格式將數據寫到指定文件中 |