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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

一文搞懂C语言文件操作

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

一、文件分類

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

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

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

FILE *fp;

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

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

三、文件順序讀寫

3.1 讀取寫入字符

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

3.2 讀取寫入字符串

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

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

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

  • 用到的函數(shù)
    • fread(buffer,size,count,fp)
      • buffer:讀取到的數(shù)據(jù)的存放地址
      • size:要讀取的字節(jié)數(shù)
      • count:要讀取多少個size字節(jié)的數(shù)據(jù)項(xiàng)
      • fp:從fp指向文件中讀取
    • fwrite(buffer,size,count,fp)
      • buffer:要寫入的數(shù)據(jù)的存放地址
      • size:要讀取的字節(jié)數(shù)
      • count:要寫入多少個size字節(jié)的數(shù)據(jù)項(xiàng)
      • fp:往fp指向文件中寫入
  • 案例
    先向一個文件中吸入一組數(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("文件打開失敗\n");exit(EXIT_FAILURE);}for(i = 0;i < N;i++){if(fwrite(&stu[i],sizeof(struct Stu),1,fp) != 1){printf("寫入文件失敗\n");}}fclose(fp);/*讀取文件*/if((fp = fopen("E:\\test1.txt","rb")) == NULL){printf("文件打開失敗\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ī)讀寫

  • 用到的函數(shù)
    • fseek(文件指針,位移量,起始點(diǎn))
      • 文件指針:再哪個文件中進(jìn)行操作
      • 位移量:從起始點(diǎn)開始,位置指針移動多少
      • 起始點(diǎn):從哪個位置開始
    • rewind()
      • 使位置指針重新返回文件的開頭
    • ftell()
      • 得到位置指針的當(dāng)前位置,用相對于文件開頭的位移量來表示
  • 案例
    先向文件中寫入4個學(xué)生的數(shù)據(jù),然后讀取第2個學(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("請輸入學(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("文件打開失敗\n");exit(EXIT_FAILURE);}for(i=0;i<N;i++){if(fwrite(&stu[i],sizeof(struct Stu),1,fp) != 1){printf("文件打開失敗\n");}}fclose(fp);if((fp = fopen("E:\\text2.txt","r")) == NULL){printf("文件打開失敗\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ì)講解,請到小甲魚(小甲魚牛逼)的網(wǎng)站上自行學(xué)習(xí)。函數(shù)詳解。

總結(jié)

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

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