日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

一文搞懂C语言文件操作

發(fā)布時(shí)間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一文搞懂C语言文件操作 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、文件分類

根據(jù)數(shù)據(jù)的組織形式,可以將文件分為文本文件和二進(jìn)制文件。通俗講,文本文件就是你能看懂的,而二進(jìn)制文件是你看不懂的!

二、文件打開(kāi)與關(guān)閉

假設(shè)已經(jīng)定義了一個(gè)文件指針

FILE *fp;

有了文件指針,意味著你就可以對(duì)文件為所欲為。

  • 用到的函數(shù)
    • fp = fopen(文件名,打開(kāi)模式);
    • fclose(fp);
      打開(kāi)模式詳見(jiàn)小甲魚(yú)學(xué)習(xí)網(wǎng)站fopen函數(shù)詳解,講的非常清楚。
  • 案例
int main() {FILE *fp;if((fp = fopen("E:\\data.txt","r")) == NULL){printf("文件打開(kāi)失敗!\n");exit(EXIT_FAILURE);}int ch;while((ch = getc(fp)) != EOF){putchar(ch);}fclose(fp); /*文件有打開(kāi),必須要有關(guān)閉*/return 0; }

三、文件順序讀寫(xiě)

3.1 讀取寫(xiě)入字符

  • 用到的函數(shù)
    • ch = fgetc(fp)
      • ch:你從文件中讀出的字符
      • fp:從哪個(gè)文件中讀
    • fputc(ch,fp)
      • ch:表示往文件中要寫(xiě)入的字符
      • fp:文件指針,表示要往哪個(gè)文件中寫(xiě)入
  • 案例
    將一個(gè)文件中的內(nèi)容拷貝到另一個(gè)文件中
int main() {FILE *fp1;FILE *fp2;int ch;if((fp1 = fopen("E:\\data.txt","r")) == NULL){printf("文件打開(kāi)失敗!\n");exit(EXIT_FAILURE);}if((fp2 = fopen("E:\\copy.txt","w")) == NULL){printf("文件打開(kāi)失敗!\n");exit(EXIT_FAILURE);}while((ch = fgetc(fp1)) != EOF){fputc(ch,fp2);}fclose(fp1);fclose(fp2);return 0; }

3.2 讀取寫(xiě)入字符串

  • 用到的函數(shù)
    • fgets(str,n,fp)
      • str:讀出的字符串存放再str中
      • n:要讀到的字符個(gè)數(shù),包括字符串結(jié)束符,即只能讀取n-1個(gè)字符
      • fp:從fp指向文件中讀取
      • 返回值:str的首地址
    • fputs(str,fp)
      • str:往fp所指文件中寫(xiě)入的字符串地址
      • fp:往fp指向文件中寫(xiě)入
      • 返回值:若寫(xiě)入成功,返回0;否則,返回EOF
  • 案例1
    往一個(gè)文件中先寫(xiě)入字符串,然后再讀取出來(lái)。
int main() {FILE *fp;char buffer[N];if((fp = fopen("E:\\test.txt","w")) == NULL){printf("文件打開(kāi)失敗\n");exit(EXIT_FAILURE);}/*往文件中寫(xiě)入*/fputs("I love FishC.com\n",fp);fputs("I love China\n",fp);fputs("I love my parent",fp);fclose(fp);if((fp = fopen("E:\\test.txt","r")) == NULL){printf("文件打開(kāi)失敗\n");exit(EXIT_FAILURE);}/*讀取*/while(!feof(fp)){fgets(buffer,N,fp);printf("%s\n",buffer);}return 0; }
  • 案例2
int main() {FILE *fp;char buffer[N];if((fp = fopen("E:\\test.txt","w")) == NULL){printf("文件打開(kāi)失敗\n");exit(EXIT_FAILURE);}/*往文件中寫(xiě)入*/fputs("I love FishC.com\n",fp);fputs("I love China\n",fp);fputs("I love my parent\n",fp); //出問(wèn)題的一行fclose(fp);if((fp = fopen("E:\\test.txt","r")) == NULL){printf("文件打開(kāi)失敗\n");exit(EXIT_FAILURE);}/*讀取*/while(!feof(fp)){fgets(buffer,N,fp);printf("%s\n",buffer);}return 0; }

NOTE:
若在讀取字符中遇到EOF,則eof指示器被設(shè)置;但是如果再?zèng)]有讀到任何字符之前就遇到了EOF,則str指示器指向的位置保持原來(lái)的位置不變,即“I love my parent”被讀取了兩次。

3.3 讀取寫(xiě)入一組數(shù)據(jù)

  • 用到的函數(shù)
    • fread(buffer,size,count,fp)
      • buffer:讀取到的數(shù)據(jù)的存放地址
      • size:要讀取的字節(jié)數(shù)
      • count:要讀取多少個(gè)size字節(jié)的數(shù)據(jù)項(xiàng)
      • fp:從fp指向文件中讀取
    • fwrite(buffer,size,count,fp)
      • buffer:要寫(xiě)入的數(shù)據(jù)的存放地址
      • size:要讀取的字節(jié)數(shù)
      • count:要寫(xiě)入多少個(gè)size字節(jié)的數(shù)據(jù)項(xiàng)
      • fp:往fp指向文件中寫(xiě)入
  • 案例
    先向一個(gè)文件中吸入一組數(shù)據(jù),然后再讀出。
#include <stdio.h> #include <stdlib.h> #define N 3 struct Stu {int num;char name[24];float score; }stu[N]; int main() {FILE *fp;int i;struct Stu temp;for(i = 0;i < N;i++){scanf("%d %s %f",&stu[i].num,stu[i].name,&stu[i].score);}if((fp = fopen("E:\\test1.txt","wb")) == NULL){printf("文件打開(kāi)失敗\n");exit(EXIT_FAILURE);}for(i = 0;i < N;i++){if(fwrite(&stu[i],sizeof(struct Stu),1,fp) != 1){printf("寫(xiě)入文件失敗\n");}}fclose(fp);/*讀取文件*/if((fp = fopen("E:\\test1.txt","rb")) == NULL){printf("文件打開(kāi)失敗\n");exit(EXIT_FAILURE);}for(i=0;i<N;i++){fread(&temp,sizeof(struct Stu),1,fp);printf("num = %d,name = %s,socre = %.2f\n",temp.num,temp.name,temp.score);}fclose(fp);return 0; }

四、文件隨機(jī)讀寫(xiě)

  • 用到的函數(shù)
    • fseek(文件指針,位移量,起始點(diǎn))
      • 文件指針:再哪個(gè)文件中進(jìn)行操作
      • 位移量:從起始點(diǎn)開(kāi)始,位置指針移動(dòng)多少
      • 起始點(diǎn):從哪個(gè)位置開(kāi)始
    • rewind()
      • 使位置指針重新返回文件的開(kāi)頭
    • ftell()
      • 得到位置指針的當(dāng)前位置,用相對(duì)于文件開(kāi)頭的位移量來(lái)表示
  • 案例
    先向文件中寫(xiě)入4個(gè)學(xué)生的數(shù)據(jù),然后讀取第2個(gè)學(xué)生的數(shù)據(jù)。
#include <stdio.h> #include <stdlib.h> #define N 3 struct Stu {int num;char name[24];float score; }stu[N],somebody; int main() {FILE *fp;int i;printf("請(qǐng)輸入學(xué)生的相關(guān)信息\n");for(i = 0;i < N;i++){scanf("%d %s %f",&stu[i].num,stu[i].name,&stu[i].score);}if((fp = fopen("E:\\text2.txt","w")) == NULL){printf("文件打開(kāi)失敗\n");exit(EXIT_FAILURE);}for(i=0;i<N;i++){if(fwrite(&stu[i],sizeof(struct Stu),1,fp) != 1){printf("文件打開(kāi)失敗\n");}}fclose(fp);if((fp = fopen("E:\\text2.txt","r")) == NULL){printf("文件打開(kāi)失敗\n");exit(EXIT_FAILURE);}printf("當(dāng)前位置指針:%d\n",ftell(fp));fseek(fp,sizeof(struct Stu),0);fread(&somebody,sizeof(struct Stu),1,fp);printf("num = %d, name = %s, score = %f",somebody.num,somebody.name,somebody.score);fclose(fp);return 0; }

五、其它函數(shù)

其他函數(shù)的詳細(xì)講解,請(qǐng)到小甲魚(yú)(小甲魚(yú)牛逼)的網(wǎng)站上自行學(xué)習(xí)。函數(shù)詳解。

總結(jié)

以上是生活随笔為你收集整理的一文搞懂C语言文件操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。