個人主頁:點我進入主頁
專欄分類:C語言初階? ? ??C語言程序設計————KTV? ? ? ?C語言小游戲? ? ?C語言進階
C語言刷題
歡迎大家點贊,評論,收藏。
一起努力,一起奔赴大廠。
目錄
1.前言
2.寫文件函數與讀文件函數
2.1fputc函數
2.2fgetc函數
2.3fputs函數
2.4fgets函數
2.5fprintf函數
2.6fscanf函數
2.7sprintf函數與sscanf函數
2.8fwrite函數
2.9fread函數?
3.通訊錄的改進
4.文件的隨機讀寫
4.1fseek函數
4.2ftell函數
4.3rewind函數
?5.總結
1.前言
? ? ? ? ?在前面我們寫到過文件的打開與關閉用到了函數主要是fopen函數,參數是文件的文件名和打開方式,文件關閉函數fclose,參數是流,我們還講到過流,今天我們講解一些寫文件與讀文件函數以及對通訊錄的改進還有一些文件的其他函數。
2.寫文件函數與讀文件函數
功能 | 函數名 | 適用于 |
字符輸入函數 | fgetc | 所有輸入流 |
字符輸出函數 | fputc | 所有輸出流 |
文本行輸入函數 | fgets | 所有輸入流 |
文本行輸出函數 | fputs | 所有輸出流 |
格式化輸入函數 | fscanf | 所有輸入流 |
格式化輸出函數 | fprintf | 所有輸出流 |
二進制輸入 | fread | 文件 |
二進制輸出 | fwrite | 文件 |
2.1fputc函數
? ? ? ? 我們在cplusplus網中?fputc看到它的第一個參數是int? chararcter,這個含義是想要存儲的字符信息,第二個參數是流在這里指fopen函數的返回值,fputc函數是將chararcter存入文件中,我們寫一個代碼將abcdef放到文件中,詳細代碼如下:
#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}int i;for (i = 'a'; i <= 'f'; i++){fputc(i, pf);}fclose(pf);pf = NULL;return 0;
}
我們運行后打開文件data.txt
我們可以看到abcdef已經寫到了文件中?先打開文件,再利用循環利用寫入字符函數fputc進行信息的存儲。
2.2fgetc函數
? ? ? ? 我們進入cplusplus網站fgetc我們看到它的參數是流,返回值是int類型,hfgetc函數的作用是讀取文件的一個字符,我們寫一個代碼讀取fputc函數存在文件的信息,詳細代碼如下:
#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}int i,ch;for (i = 'a'; i <= 'f'; i++){ch = fgetc(pf);printf("%c", ch);}fclose(pf);pf = NULL;return 0;
}
我們運行結果如下:
2.3fputs函數
? ? ? ? ?我們進入cplusplus網站fputs,函數的第一個參數是const char *str是將str中的內容傳到文件中,第二個參數是流 ,返回類型是int,fputs函數的作用是將字符串傳到文件中,我們寫一個代碼將字符串abcdefgh傳到文件中,詳細代碼如下:
#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}char arr[] = "abcdefgh";fputs(arr,pf);fclose(pf);pf = NULL;return 0;
}
運行后我們打開data.txt文件 可以看到
我們如果再次將arr內容改為ccc運行后打開data.txt文件
我們還可以看到打開文件后光標都在最前面,而且原來的信息也沒有了,那我們是不是可以理解為寫入文件是將原來的文件的內容覆蓋,?然后寫入信息。
2.4fgets函數
? ? ? ? 我們進入cplusplus網站fgets看到它的第一個參數是char *str是讀取文件后存放在程序的變量,第二個參數int num是在文件中讀取幾個字符+1,第三個參數是流,返回值是char*,例如我們想讀取文件中的abcdefg,詳細代碼如下:
#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}char arr[1006] ;char* p = arr;p = fgets(p, 7, pf);printf("%s", arr);fclose(pf);pf = NULL;return 0;
}
我們運行后可以看到
?對于為什么是7,原因很簡單,fgets函數會在最后將數組的第num個位置轉化為’\0‘,我們進入調試可以看到
2.5fprintf函數
?
? ? ? ? 我們進入 cplusplus網站fprintf?查看fprintf函數的參數,看到這個函數你是不是會想到printf函數,我們同樣查看printf函數的參數
我們可以看到他們兩個只差流這個參數,fprintf函數是格式化輸入文件,我們寫一個代碼來展示一下這個函數的功能,代碼如下:
#include<stdio.h>
struct num {float s;int i;char s1[10];
}S;
int main(){FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}S = { 1.23f,10,"wo" };fprintf(pf, "%f-%d-%s", S.s, S.i, S.s1);fclose(pf);pf = NULL;return 0;
}
?我們運行程序后打開data.txt文件,可以看到
同樣我們可以理解為將結構體S里面的內容,以? -? -? 的形式輸出到文件里。
2.6fscanf函數
? ? ? ? ?我們進入cplusplus網站fscanf查看fscanf函數的參數,看到fscanf函數我們很容易想到scanf函數,我們同樣進入cplusplus網站查看scanf函數的參數,
我們可以看到這兩個函數的參數只差了一個流,?fscanf函數是將文件中有格式的信息儲存在程序中定義的變量里,我們利用fprintf函數儲存在文件的內容來初始化結構體S,詳細代碼如下:
#include<stdio.h>
struct num {float s;int i;char s1[10];
}S;
int main(){FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}fscanf(pf,"%f-%d-%s", &S.s, &S.i, &S.s1);printf("%f %d %s", S.s, S.i, S.s1);fclose(pf);pf = NULL;return 0;
}
我們運行代碼,可以看到
2.7sprintf函數與sscanf函數
? ? ? ? sprintf函數是將數據以字符的形式存在s中,?sscanf函數是將s的數據以字符的形式存在程序定義的變量中,我們寫一個程序,代碼如下:
#include<stdio.h>
struct num {int i;char arr;float f;
};
int main()
{struct num s = { 10,'c',1.2f};char arr[100] = { 0 };sprintf(arr, "%d%c%f", s.i, s.arr, s.f);struct num tmp = { 0 };sscanf(arr, "%d%c%f", &tmp.i, &tmp.arr, &tmp.f);printf("%d %c %f", tmp.i, tmp.arr, tmp.f);return 0;
}
運行結果如下:
2.8fwrite函數
? ? ? ? 我們進入cplusplus網站fwrite的參數第一個參數是const void *ptr是指向的數據的地址,第二個參數size_t size是單個數據所占據的字節,第三個參數size_t count是要寫進文件幾個數據,第四個參數是流,特別注意這是以二進制的形式儲存在文件中?,我么們寫一個代碼展示一下函數的功能,代碼如下:
#include<stdio.h>
struct num {int i;char arr[10];char brr[10];
};
int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}struct num s = { 1,"abcd","efg" };fwrite(&s, sizeof(struct num), 1, pf);fclose(pf);pf = NULL;return 0;
}
我們運行代碼后,打開data.txt文件可以看到:
由于是二進制的形式存儲,所以有些信息我們不能識別。
2.9fread函數?
? ? ? ? ?我們進入cplusplus網站看fread的參數一個參數是const void *ptr是要讀取文件信息保存到,第二個參數size_t size是單個數據所占據的字節,第三個參數size_t count是要寫進文件幾個數據,第四個參數是流,我們讀取上個函數的內容,代碼如下:
#include<stdio.h>
struct num {int i;char arr[10];char brr[10];
};
int main()
{FILE* pf = fopen("data.txt", "r ");if (pf == NULL){perror("fopen");return 1;}struct num s;fread(&s, sizeof(struct num), 1, pf);printf("%d\n%s\n%s", s.i, s.arr, s.brr);fclose(pf);pf = NULL;return 0;
}
運行程序后可以看到
3.通訊錄的改進
在程序中加入函數
void init(Struct* pc)
{assert(pc);FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return;}while (fread(pc->arr + pc->i , sizeof(struct xinxi), 1, pf)){ pc->i++;addnum(pc);}fclose(pf);pf = NULL;
}
以及函數
void save(Struct* pc)
{assert(pc);FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fclose");return;}int i;for (i = 0; i < pc->i; i++){fwrite(pc->arr + i, sizeof(struct xinxi), 1, pf);}fclose(pf);pf = NULL;
}
4.文件的隨機讀寫
4.1fseek函數
根據文件指針的位置和偏移量來定位文件指針,第一個參數是流,第二個參數是偏移量v,第三個參數是相對位置,SEEK_SET是對于最初的位置,SEEK_CUR是對現在的位置,SEEK_END是對最后一位的位置。
?我們寫一個代碼,如下:
#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r ");if (pf == NULL){perror("fopen");return 1;}int ch;ch = fgetc(pf);printf("%c", ch);//ach = fgetc(pf);printf("%c", ch);//bch = fgetc(pf);printf("%c", ch);//cfseek(pf, -3, SEEK_CUR);ch = fgetc(pf);printf("%c", ch);//afclose(pf);pf = NULL;return 0;
}
運行后為
這個函數有一定的局限性,我們必須對文件的內容非常熟悉,否則不容易輸出我們想要的值。
4.2ftell函數
這個函數是計算相對于初始位置的偏移量?,我們可以寫一個代碼,如下:
#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r ");if (pf == NULL){perror("fopen");return 1;}fseek(pf, 0, SEEK_END);size_t sz = ftell(pf);printf("%d", sz);fclose(pf);pf = NULL;return 0;
}
運行結果為
4.3rewind函數
函數的功能是讓指針指向初始位置,我們寫一個代碼,來展示一下它的功能:
#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r ");if (pf == NULL){perror("fopen");return 1;}fseek(pf, -1, SEEK_END);int ch;ch = fgetc(pf);printf("%c\n", ch);rewind(pf);ch = fgetc(pf);printf("%c\n", ch);fclose(pf);pf = NULL;return 0;
}
運行結果為
文件的內容為
?5.總結
? ? ? ? 今天主要包括將數據傳入文件的函數,以及將文件中的內容傳到程序中的函數,還有一些對于文件中的指針以及偏移量的函數fseek函數,ftell函數,rewind函數的講解,異界對通訊錄的改造.今天的內容就結束了。