目錄
1.?fread?從文件中讀取數據
1.1 讀取次數 × 每次讀取字節數 < 原內容字節數
1.2?讀取次數 × 每次讀取字節數 >?原內容字節數
2.fwrite 向文件中寫入數據
2.1寫入字符串驗證
2.2寫入結構體驗證
3.?fprintf?將數據寫入到指定文件
4. fscanf 從文件中逐行讀取內容,并將其存儲在結構中
4.1 讀取整形、浮點型、字符程序:
4.2?讀取結構體程序:
4.2.1讀取 空格 間隔數據
4.2.2讀取 空格-空格 間隔數據
5.fprintf 和 fscanf 聯合使用
1.?fread?從文件中讀取數據
函數原型:
/* 功能:從文件中讀取數據
參數:
ptr:保存讀取的數據
size:每次讀取的字節數
nmemb:一共讀取的次數
stream:文件指針返回值:成功:實際讀取的次數(對象數、塊數)失敗:0如果文件內容讀取完畢,返回0 */
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
1.1 讀取次數 × 每次讀取字節數 < 原內容字節數
程序:file.txt 共32個字節,程序讀取3次,每次6個字節,共18個字節。
#include <stdio.h>int test1()
{FILE *fp = NULL;//只讀打開 file.txtfp = fopen("./file.txt", "r");if(fp == NULL){printf("fail to fopen\n");return -1;}//使用fread函數讀取文件內容int num;char buf[64] = {0};//從fp中讀取3次數據,每次讀取6個字節,保存到bufnum = fread(buf, 6, 3, fp);printf("buf = %s\n", buf);printf("num = %d\n", num);if(num == 0){printf(" fail to fread \n", num);}fclose(fp); return 0;
}int main(int argc, char *argv[])
{test1();return 0;
}
運行結果:
1.2?讀取次數 × 每次讀取字節數 >?原內容字節數
?例: fread(buf, size, num, fp); //讀取num次,每次size個字節大小。
若:如果讀到 n*size 個字節,返回值為 n?
.....
?如果讀到了大于等于2*size 個字節, 小于3*size個字節, 返回值為 2
?讀到的字節數,大于等于size 個字節 ,小于2*size個字節, 返回值為 1
?不到size 個字節,返回值為 0?
int num?= fread(str,10,3,fp);
讀取的字節數為 ,每次讀取10個字節,讀3次,?返回值為num。
?如果讀到30個字節,返回值num為3
?如果讀到了大于等于20個字節,小于30個字節, 返回值為2
?讀到的字節數,大于等于10個字節,小于20個字節 返回值為1
?不到10個字節,返回值為0
程序:
#include <stdio.h>int test1()
{FILE *fp = NULL;//只讀打開 file.txtfp = fopen("./file.txt", "r");if(fp == NULL){printf("fail to fopen\n");return -1;}//使用fread函數讀取文件內容int num;char buf[64] = {0};//從fp中讀取3次數據,每次讀取6個字節,保存到bufnum = fread(buf, 30, 3, fp);printf("buf = %s\n", buf);printf("num = %d\n", num);if(num == 0){printf(" fail to fread \n", num);}fclose(fp); return 0;
}int main(int argc, char *argv[])
{test1();return 0;
}
運行結果:修改程序每次讀取字節數
(1)num = fread(buf, 30, 3, fp);
(2)num = fread(buf, 15, 3, fp);
(3)num = fread(buf, 35, 3, fp);
2.fwrite 向文件中寫入數據
函數原型:
/*功能:向文件中寫入數據
參數:
ptr:要寫入的數據
size:一次寫入的字節數
nmemb:一共寫入的次數
stream:文件指針返回值:成功:實際寫入的次數失敗:0 */
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
2.1寫入字符串驗證
程序:
#include <stdio.h>
#include <string.h>int test1()
{FILE *fp = NULL;//讀寫打開 file.txt,不存在創建,存在清0fp = fopen("./file.txt", "w+");if(fp == NULL){printf("fail to fopen\n");return -1;}int num;char buf[] = {"hello world"};//向fp中寫入3次數據,每次寫入strlen(buf)個字節,num = fwrite(buf, strlen(buf), 3, fp);printf("strlen(buf) = %d\n", strlen(buf));printf("fwrite num = %d\n", num);printf("fwrite size = %d\n", num*strlen(buf));//向文件寫入字節大小if(num == 0){printf(" fail to fwrite \n", num);}//將文件的偏移量設置為文件的起始位置rewind(fp);//使用fread函數讀取文件內容char buf1[128] = {0};//從fp中讀取3次數據,每次讀取strlen(buf)個字節,保存到buf1num = fread(buf1, strlen(buf), 3, fp);printf("fread num = %d\n", num);printf("buf1 = %s\n", buf1);printf("strlen(buf1) = %d\n", strlen(buf1));if(num == 0){printf(" fail to fread \n", num);}fclose(fp); return 0;}int main(int argc, char *argv[])
{test1();return 0;
}
運行結果:對file.txt寫入3次hello world ,每次寫入11個字節
2.2寫入結構體驗證
程序:
#include <stdio.h>
#include <string.h>typedef struct{int i1;int i2;char c1;char c2;
}DATA;int test2()
{FILE *fp = NULL;fp = fopen("./file1.txt", "w+");if(fp == NULL){printf("fail to fopen\n");return -1;}//使用fwrite向文件寫入一個結構體DATA data[3] = {1, 2, 'a', 'b', 3, 4, 'c', 'd', 5, 6, 'e', 'f',};//向fp寫入3次數據,每次sizeof(DATA)個字節int num = fwrite(data, sizeof(DATA), 3, fp);printf("fwrite num = %d\n", num);//將文件的偏移量設置為文件的起始位置,不設為起始,讀取位置將從寫入最后一個字節之后開始。rewind(fp);DATA read_data[3];//從fp讀取寫入數據,每次sizeof(DATA)個字節,讀取3次數據int num1 = fread(read_data, sizeof(DATA), 3, fp);printf("fread num = %d\n", num1);int j;for(j = 0; j < 3; j++) //循環讀取read_data數據{printf("%d - %d - %c - %c\n", read_data[j].i1, read_data[j].i2, read_data[j].c1, read_data[j].c2);}fclose(fp); return 0;
}int main(int argc, char *argv[])
{test2();return 0;
}
運行結果:
3.?fprintf?將數據寫入到指定文件
函數原型:
/* fprintf 和printf函數類似:printf是將數據輸出到屏幕上(標準輸出),fprintf函數是將數據輸出到文件指針所指定的文件中。 *//* 參數?:
stream:文件指針,指定輸出目標(如文件、stdout、stderr)。
format:格式化字符串,定義輸出格式(如 %d, %s, %f)。
...:可變參數列表,對應 format 中的格式說明符。
?返回值?:成功時返回寫入的字符數,失敗時返回負值。 */int fprintf(FILE *stream, const char *format, ...);
程序:
#include <stdio.h>
#include <string.h>int test1()
{char ch='a';int num=10;char str[20]="hello world";float score = 68.9;FILE *fp = NULL;//讀寫打開 file.txtfp = fopen("./file.txt", "w+");if(fp == NULL){printf("fail to fopen\n");return -1;}//使用fprintf向文件寫入字符串int num1 = fprintf(fp,"%c %d %s %f\n",ch,num,str,score);printf("fprintf num = %d\n", num1);if(num1 < 0){printf(" fail to fprintf \n");return -1;}fclose(fp); return 0;
}int main(int argc, char *argv[])
{test1();return 0;
}
運行結果:
4. fscanf 從文件中逐行讀取內容,并將其存儲在結構中
函數原型:
/* fscanf和scanf 函數類似:scanf是從鍵盤(標準輸入)獲取輸入,fscanf是從文件指針所標示的文件中獲取輸入。 *//* 參數?:
stream:文件指針(如 FILE *fp 或 stdin)?。
format:格式字符串,定義輸入數據的格式(如 %d, %s, %f)?。
...:可變參數列表,需為變量地址(如 &num, name 數組名)? ?返回值?:
成功時,返回輸入數據格式數量?(%d %s 等成功讀取的個數)。
失敗或 文件結尾返回 EOF(即 -1)? */int fscanf(FILE *stream, const char *format, ...)
4.1 讀取整形、浮點型、字符程序:
#include <stdio.h>
#include <string.h>int test1()
{ char ch;int num;char str[32] = "";float score ;FILE *fp = NULL;//追加讀寫打開 file.txtfp = fopen("./file.txt", "r");if(fp == NULL){printf("fail to fopen\n");return -1;}//將文件的偏移量設置為文件的起始位置,不設為起始,讀取位置將從寫入最后一個字節之后開始。//rewind(fp);//從指定文件讀取數據int num1 = fscanf(fp,"%c %d %s %f\n", &ch, &num, &str, &score);printf("ch= %c num= %d str= %s score= %f\n", ch, num, str, score);printf("fprintf num1 = %d\n", num1);if(num1 == EOF){printf(" fprintf fail or end \n");return -1;}return 0;
}int main(int argc, char *argv[])
{test1();fclose(fp);return 0;
}
運行結果:
file.txt原有內容:
4.2?讀取結構體程序:
4.2.1讀取 空格 間隔數據
程序:
#include <stdio.h>
#include <string.h>typedef struct
{char name[32];int age; int score;
}DATA;int test2()//循環讀取文件內容
{FILE *fp = NULL;//只讀打開 file.txtfp = fopen("./file1.txt", "r");if(fp == NULL){printf("fail to fopen\n");return -1;}DATA dt;//從指定文件循環讀取一行數據while(fscanf(fp, "%s %d %d\n", dt.name, &dt.age, &dt.score) == 3) //char name[32];{printf("name= %s age= %d score= %d\n", dt.name, dt.age, dt.score );}fclose(fp);return 0;
}int main(int argc, char *argv[])
{test2(); return 0;
}
運行結果:
注意fscanf第二個參數要與文件數據格式保持一致。
fscanf(fp, "%s %d %d", dt.name, &dt.age, &dt.score);
4.2.2讀取 空格-空格 間隔數據
程序:
#include <stdio.h>
#include <string.h>typedef struct
{char name[32];int age; int score;
}DATA;int test2()//循環讀取文件內容
{FILE *fp = NULL;//只讀打開 file.txtfp = fopen("./file1.txt", "r");if(fp == NULL){printf("fail to fopen\n");return -1;}DATA dt;//fprintf 和 fscanf 聯合使用,fprintf寫入文本時加入\n,在fscanf讀取時也要加\n。
//單獨使用fscanf讀取多行數據時,可不加\n//從指定文件循環讀取一行數據while(fscanf(fp, "%s - %d - %d", dt.name, &dt.age, &dt.score) == 3)//while(fscanf(fp, "%s - %d - %d\n", dt.name, &dt.age, &dt.score) == 3){printf("name= %s age= %d score= %d\n", dt.name, dt.age, dt.score );}fclose(fp);return 0;
}int main(int argc, char *argv[])
{test2(); return 0;
}
運行結果:注意fscanf第二個參數要與文件數據格式保持一致。
fscanf(fp, "%s - %d - %d", dt.name, &dt.age, &dt.score);
5.fprintf 和 fscanf 聯合使用
程序:
#include <stdio.h>
#include <string.h>int test4()//
{FILE *fp = NULL;//讀寫打開 file.txtfp = fopen("./file.txt", "w+");if(fp == NULL){printf("fail to fopen\n");return -1;}int num = 0;char ch1 = 'a', ch11;int i1 = 1, i11;char ch2 = 'e', ch22;int i2 = 10, i22;int j = 0;for(j = 0;j < 3;j++){//使用fprintf向文件寫入字符串num = fprintf(fp,"%c %d %c %d\n",ch1 + j, i1 + j, ch2 + j, i2 + j);if(num < 0){printf("fail to fprintf\n");}}//將文件的偏移量設置為文件的起始位置,不設為起始,讀取位置將從寫入最后一個字節之后開始。rewind(fp);//fprintf 和 fscanf 聯合使用,fprintf寫入文本時加入\n,在fscanf讀取時也要加\n。
//單獨使用fscanf讀取多行數據時,可不加\n//從指定文件循環讀取一行數據//while(fscanf(fp, "%c %d %c %d\n",&ch11 , &i11 , &ch22 , &i22) == 4) {printf("read:%c %d %c %d\n", ch11 , i11 , ch22 , i22 );}fclose(fp);return 0;
}int main(int argc, char *argv[])
{test4();return 0;
}
運行結果:
注意:(1)寫入文件后,將偏移量移至文件開頭。 // rewind(fp);
(2)程序寫入了 \n;
fprintf(fp,"%c %d %c %d\n",ch1 + j, i1 + j, ch2 + j, i2 + j);
讀取時也要加:
while(fscanf(fp, "%c %d %c %d\n",&ch11 , &i11 , &ch22 , &i22) == 4)
(3)//fprintf 和 fscanf 聯合使用,fprintf寫入文本時加入\n,在fscanf讀取時也要加\n。
//單獨使用fscanf讀取多行數據時,可不加\n