tft每日頭條

 > 科技

 > c語言文件讀取方面

c語言文件讀取方面

科技 更新时间:2024-09-29 18:28:10

c語言文件讀取方面?1、文件的分類:文件分為兩大類,一類是磁盤文件一類是設備文件,下面我們就來聊聊關于c語言文件讀取方面?接下來我們就一起去了解一下吧!

c語言文件讀取方面(C語言中文件的相關操作)1

c語言文件讀取方面

1、文件的分類:

文件分為兩大類,一類是磁盤文件一類是設備文件。

磁盤文件:指一組相關數據的介質,通常存儲在外部介質上,使用時才調入内存。

設備文件:在操作系統中把每一個與主機相連的輸入、輸出設備看做是一個文件,把他們的輸入、輸出等同于對自盤文件的讀和寫。

1.1磁盤文件的分類

磁盤文件分為兩大類分别是文本文件和二進制文件

文本文件:基于字符編碼的文件;基于字符編碼,常見編碼有ASCII、UNICODE等

一般可以使用文本編輯器直接打開。

二進制文件:基于值編碼的文件;自己根據具體應用,指定某個值是什麼意思

把内存中的數據按其在内存中的存儲形式原樣輸出到磁盤上。

2、文件的打開和關閉

2.1文件指針file

在C語言中用一個指針變量指向一個文件,這個指針稱為文件指針

FILE是系統typedef定義出來的有關文件信息的一種結構體類型,結構中含有

文件名、文件狀态和文件當前位置等信息。

#include<stdio.h> FILE* fopen(const char* filename,const char* mode) 功能:打開文件 參數: filename:需打開的文件名,根據需要添加路徑 mode:打開文件的模式設置 返回值: 成功:文件指針 失敗:NULL

參數二mode的幾種形式:

r或者rb:以隻讀方式打開一個文本文件(不創建文件,若文件不存在則報錯)

w或wb:以寫的方式打開(如果文件存在則清空文件,文件不存在則創建一個文件)

a或者ab:以追加的方式打開文件,在末尾添加内容,若文件不存在則創建文件

r 或者rb :以可讀、可寫的方式打開文件(不創建新文件)

w 或wb :以可讀、可寫的方式打開文件(如果文件存在則清空文件,文件不存在則創建一個文件)

a 或者ab :以添加方式打開文件,打開文件并在末尾更改文件,若文件不存在則創建文件

打開的文件會占用内存資源,如果總是打開不關閉,會消耗很多内存。

一個進程同時打開的文件數是有限制的,超過最大同時打開文件數,在此調用fopen打開會失敗

如果沒有明确調用fclose關閉打開的文件,那麼程序在退出的時候,操作系統會統一關閉。

#include<>stdio.h int fclose(FILE * stream); 功能:關閉先前fopen()打開的文件。此動作讓緩沖區的數據寫入文件中,并釋放系統所提供的文件資源 參數: stream:文件指針 返回值: 成功 0 失敗 -1

3、文件字符、行讀寫:

fgetc()、fputc()

①寫文件: #include<stdio.h> int fputc(int ch,FILE * stream); 功能: ch:需要寫入文件的字符; stream:文件指針 返回值: 成功:成功寫入文件的字符 失敗:返回 -1

③讀文件: #include<stdio.h> int fgetc(FILE*stream); 功能: 從stream指定的文件中讀取一個字符 參數: stream:文件指針 返回值: 成功:返回讀取到的字符 失敗:-1

②fEOF(): #include<stdio.h> int feof(FILE*stream); 功能: 檢測是否讀取到了文件結尾。判斷的是最後一次“讀操作的内容”,不是當前位置内容 參數: stream:文件指針 返回值: 非0值:已經到文件結尾 0:未到文件結尾

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<time.h> int main0201() { FILE* fp = fopen("F:/a.txt", "r"); if (!fp) { printf("文件打開失敗\n"); return -1; } char ch; //文件的字符讀取 //文件默認結尾為-1 ch = fgetc(fp); printf("%c\n", ch); //fp ;//err 不能修改文件指針 文件在讀取中光标流會自動向下移動 ch = fgetc(fp); printf("%c\n", ch); ch = fgetc(fp); printf("%c\n", ch); ch = fgetc(fp); printf("%c\n", ch); fclose(fp); return 0; } int main0202(void) { FILE* fp = fopen("F:/a.txt", "r");//以讀的方式打開文件 if (!fp) { return -1; } char ch; while ((ch = fgetc(fp))!=EOF) { printf("%c", ch); } fclose(fp); } int main0203(void) { //以寫的方式打開文件 若文件不存在 會創建一個新文件 若文件存在将清空内容 FILE* fp = fopen("F:/b.txt", "w"); if (!fp) { return -1; } char ch = 'a'; fputc(ch, fp); fclose(fp); return 0; } int main0204(void) { FILE* fp = ("D:/a.c", "w"); if (!fp) { printf("文件打開失敗\n"); return -1; } char ch; while (1) { scanf("%c", &ch); if (ch == '@') { break; } fputc(ch, fp); } fclose(fp); return 0; }

①寫文件 fputs #include<stdio.h> int fputs(const char* str,FILE* stream); 功能: 将str所指定的字符串寫入到stream指定的文件中,字符串結束符‘\0’不寫入文件。 參數: str:字符串 stream:文件指針 返回值: 成功:0 失敗:-1

②讀文件 fgets #include<stdio.h> char * fgets(char * str , int size , FLIE * stream); 功能:從stream指定的文件内讀入字符,保存到str所指定的内存空間,直到出現換行 字符、讀到文件結尾或已讀了size-1個字符為止,最後會自動加上字符‘\0’作為字符串結束 參數: str:字符串 size:指定最大讀取字符串的長度(size-1) stream:文件指針,如果鍵盤輸入的字符串,固定寫為stdin 返回值: 成功:成功讀取的字符串 讀到文件尾或出錯:NULL

四則運算練習

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<time.h> enum opt//枚舉 { add,sub,mlt,dive }; int main05() { srand((size_t)time(NULL));//添加随機數種子 FILE* fp = fopen("F:/四則運算.txt", "w"); if (!fp) return -1; int a, b; char c; char* p = (char*)malloc(sizeof(char) * 20); for (int i = 0; i < 100; i ) { a = rand() 1;// 随機的數字是0~9 再 1是1~10 b = rand() % 10 1; switch (rand()%4) { case add:c = ' ';break; case sub:c = '-';break; case mlt: c = '*';break; case dive: c= '/';break; } memset(p, 0, 20); sprintf(p, "%d%c%d=\n", a, c,b); fputs(p, fp); } free(p); fclose(fp); //p = NULL; //fp = NULL; return 0; }

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<time.h> int main06() { FILE* fp1 = fopen("F:/四則運算.txt", "r"); FILE* fp2 = fopen("F:/四則運算結果.txt", "w"); if (!fp1 || !fp2) { printf("打開文件失敗\n"); return -1; } //!feof(fp);文本文件和二進制文件均可判斷是否為結尾 EOF僅用于文本文件 int a, b, sum; char c; char* p = (char*)malloc(sizeof(char) * 20); for (int i = 0; i < 100; i ) { memset(p, 0, 20); fgets(p, 20, fp1); sscanf(p,"%d%c%d=\n", &a, &c, &b); switch (c) { case' ':sum = a b; break; case'-':sum = a - b; break; case'*':sum = a * b; break; case'/':sum = a / b; break; } memset(p, 0, 20); sprintf(p, "%d%c%d=%d\n", a, c, b, sum); fputs(p, fp2); } free(p); fclose(fp1); fclose(fp2); return 0; }

4、文件格式化讀寫

fprintf()、fscanf()

①寫文件 fprintf() #include<stdio.h> int fprintf(FILE*stream,const char *format,...); 功能: 根據參數format字符串來轉換并格式化數據,然後将結果輸出到stream指定文件中,指定 出現字符串結束符‘\0’為止 參數: stream:已打開的文件 format:字符串格式,用法和printf()一樣 返回值: 成功:實際寫入文件的字符個數 失敗:-1

②讀文件 fscanf() #include<stdio.h> int fscanf(FILE * stream,const char * format,...); 功能: 從stream指定的文件讀取字符串,并根據參數format字符串來轉換并格式化數據。 參數: stream:已打開的文件 format:字符串格式,用法和scanf()一樣 返回值: 成功:參數數目,成功轉換的值的個數 失敗:-1

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<time.h> int main0701()//fscanf()從文件中獲取寫入數據 { FILE* fp = fopen("F:/a.txt", "r"); if (!fp) return -1; char* p = (char*)malloc(sizeof(char) * 100); int a; fscanf(fp, "%d", &a); printf("%d\n",a); fscanf(fp, "%s", p); printf("%s", p); fclose(fp); free(p); return 0; } int main0702(void) { FILE* fp = fopen("F:/b.txt", "r"); if (!fp) return -1; //int a, b, c; //fscanf(fp, "%d %d=%d", &a, &b, &c); //char ch[20] = {0};//初始化為0 //memset(fp,0,20);//同上初始化 //fscanf(fp, "%[^\n]", ch);//正則表達式 讀取到空格 //fscanf(fp, "c", ch); //printf("%s\n", ch); //printf("%d\n%d\n%d\n", a, b, c); int a; fscanf(fp, "%x", &a); printf("%d\n", a); fclose(fp); return 0; } int main0703(void) { FILE* fp = fopen("f:/b.txt", "w"); if (!fp) return -1; //char ch[] = "hello world"; //fprintf(fp, "%s", ch); int a = 10; fprintf(fp, "x", a); fclose(fp); } int main0704(void) { srand((size_t)time(NULL)); FILE* fp = fopen("f:/四則運算.txt", "w"); if (!fp) return -1; int a, b; char c; for (int i = 0; i < 100; i ) { a = rand() % 10 1; b = rand() % 10 1; switch (rand()%4)//rand()%4 随機0~3的數字 { case 0:c = ' '; break; case 1:c = '-'; break; case 2:c = '*'; break; case 3:c = '/'; break; } fprintf(fp, "%d%c%d=\n", a, c, b); } fclose(fp); } int main0705(void) { FILE* fp1 = fopen("F:/四則運算.txt","r"); FILE* fp2 = fopen("F:/四則運算結果.txt","w"); if (!fp1 || !fp2) { printf("文件打開失敗\n"); return -1; } int a, b,sum; char c; for (int i = 0; i < 100; i ) { fscanf(fp1, "%d%c%d=\n", &a, &c, &b); switch (c) { case' ':sum = a b; break; case'-':sum = a - b; break; case'*':sum = a * b; break; case'/':sum = a / b; break; } fprintf(fp2, "%d%c%d=%d\n", a, c, b, sum); } fclose(fp1); fclose(fp2); }

大文件排序:

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<time.h> int main08() { srand((size_t)time(NULL)); FILE* fp = fopen("f:/數據.txt", "w"); if (!fp) return -1; for (int i = 0; i < 1000; i ) { fprintf(fp, "%d\n", rand() % 256); } fclose(fp); return 0; }

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<time.h> void Bubble_Sort(int * arr, int len) { for (int i = 0; i < len - 1; i ) { for (int j = 0; j < len - i - 1; j ) { if (arr[j] > arr[j 1]) { int temp = arr[j]; arr[j] = arr[j 1]; arr[j 1] = temp; } } } } int main0901() { FILE* fp1 = fopen("F:/數據.txt", "r"); FILE* fp2= fopen("F:/數據冒泡排序版.txt", "w"); if (!fp1 || !fp2); return -1; //冒泡排序法 int* arr = (int*)malloc(sizeof(int) * 1000); for (int i = 0; i < 1000; i ) { fscanf(fp1, "%d\n", &arr[i]); } Bubble_Sort(arr, 1000); for (int i = 0; i < 1000; i ) { fprintf(fp2, "%d\n", arr[i]); } free(arr); fclose(fp1); fclose(fp2); return 0; } int main0902() { FILE* fp1 = fopen("F:/數據.txt", "r"); FILE* fp2 = fopen("F:/數據插入版.txt", "w"); if (!fp1 || !fp2); return -1; int* arr = (int*)malloc(sizeof(int) * 256); memset(arr, 0, sizeof(int) * 256); for (int i = 0; i < 1000; i ) { int value; fscanf(fp1, "%d\n", &value); arr[value] ;//将數據的個數放在隊形的下标裡 } for (int i = 0; i < 256; i ) { for (int j = 0; j < arr[i]; j ) { fprintf(fp2, "%d\n", i); } } free(arr); fclose(fp1); fclose(fp2); }

5、文件塊讀寫

fread()、fwrite()

①寫文件 fwrite #include<stdio.h> size_t fwrite(const void * ptr , size_t size , size_t nmemb,FILE * stream); 功能: ptr:準備寫入文件數據的地址 參數: size:size_t為unsigned int類型,此參數指定寫入文件内容的塊數據大小 nmemb:寫入文件袋 塊數據,寫入文件數據總大小為:size * nmemb stream:已經打開的文件指針 返回值: 成功:實際成功寫入文件數據的塊數目,此值和nmemb相等 失敗:0

②讀文件 fread #include<stdio.h> size_t fread(void * ptr , size_t size , size_t nmemb , FILE * stream); 功能: 以數據塊的方式從文件中讀取内容 參數: ptr:存放讀取出來數據的内存空間 size:size_t為unsigned int類型,此參數指定讀取文件内容的塊數據大小 nmemb:讀取文件的塊數,讀取文件數據總大小為:size * nmemb 返回值: 成功:實際成功讀取到内容的塊數,蜀國此值比nmemb小, 但大于0,說明讀到文件結尾 失敗:0

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<time.h> int main10_01()//fwrite(寫入文件地址,sizeof(類型),元素個數,寫入文件指針)函數 { FILE* fp = fopen("F:/c.txt", "wb"); if (!fp) return -1; //int a = 5678; int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; fwrite(arr, sizeof(int), 10, fp); fclose(fp); return 0; } int main10_02(void)//fread()函數 { FILE* fp = fopen("f:/c.txt", "rb"); if(!fp) return -1; //int value; //fread(&value, sizeof(int), 1, fp); int arr[10] = { 0 }; fread(arr, sizeof(int), 10, fp); for (int i = 0; i < 10; i ) { printf("%d\n", arr[i]); } fclose(fp); return 0; }

6、文件讀寫結構體

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<time.h> typedef struct student { char name[21]; int age; int score; char addr[51]; }stu; int main11_01() { stu ss[3] = { {"陳勝",22,10,"北京市"}, {"吳廣",25,15,"昌平"}, {"胡海",15,20,"海澱"}, }; FILE* fp = fopen("d:/d.txt", "wb"); if (!fp)return -1; for (int i = 0; i < 3; i ) { fwrite(&ss[i], sizeof(stu), 1, fp); } fclose(fp); return 0; } int main(void) { FILE* fp = fopen("d:/d.txt", "rb"); if (!fp)return -1; stu* ss = (stu*)malloc(sizeof(stu) * 3); int i = 0; while (!feof(fp)) { fread(&ss[i], sizeof(stu), 1, fp); i ; } for (int i = 0; i < 3; i ) { printf("姓名:%s\n", ss[i].name); printf("年齡:%d\n", ss[i].age); printf("分數:%d\n", ss[i].score); printf("地址:%s\n", ss[i].addr); } free(ss); fclose(fp); return 0; }

//文件的随機讀寫 #include<stdio.h> int fseek(FILE * stream , long offset , int whence); 功能: 移動文件流(文件光标)的讀寫位置 參數: stream:已經打開的文件指針 offset:根據whence來移動的位移數(偏移量),可以是正數,也可以是負數,如果是正數 則上對于whence往右移,如果是負數,則相對于whence往左移。如果向前移的字節數超過 了文件開頭則出錯返回,如果向後移動的字節數超過了文件末尾,再此寫入時将增大文件尺寸。 whence:其取值如下: SEEK_SET:從文件開頭移動offse個字節 SEEK_CUR:從當前位置移動offset個字節 SEEK_END:從文件末尾移動offset個字節 返回值: 成功:0 失敗:-1

7、獲取文件狀态

①stat #include<sys/types.h> #include<sys/stat.h> int stat(const char * path , struct stat * buf); 功能: path:文件名 buf:保存文件信息的結構體 返回值: 成功:0 失敗:-1

②ftell #include<stdio.h> long ftell(FILE * stream); 功能: stream:已經打開的文件指針 返回值: 成功:當前文件流(文件光标)的讀寫位置 失敗:-1

③rewind #include<stdio.h> void rewind(FILE * stream) 功能: 把文件流(光标流)的讀寫位置移動到文件開頭 參數: stream:已經打開的文件指針 返回值: 無返回值

8、删除文件、重命名文件名

①remove #include<stdio.h> int remove(const char * pathname); 功能: 删除文件 參數: pathname:文件名 返回值: 成功:0 失敗:-1

②rename #include<stdio.h> int rename(const char * oldpath,const char * newpath); 功能: 把oldpath的文件名改為newpath 參數: oldpath:舊文件名 newpath:新文件名 返回值: 成功:0 失敗:-1

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved