C語言超詳細(xì)文件操作基礎(chǔ)下篇
一、文件的順序讀寫
兄弟們,上一章只介紹到了如何把單個的字符或者字符串如何寫到文件里或者從文件中讀取,文件的順序讀寫后面還有幾個函數(shù)沒有介紹完,我們接著上一章繼續(xù),給大家介紹完,圖片再拷給大家回顧回顧
1圖片如下:
1.格式化的輸出函數(shù)(fprintf)
這樣我們就可以把格式化的數(shù)據(jù)寫到文件里了。
代碼如下:
#include<stdio.h> struct S { char arr[10]; int num; float sc; }; int main() { struct S s = { "abcdef",20,5.5f }; FILE* pf = fopen("test.dayta", "w"); if (NULL == pf) { return 1; } //寫文件 fprintf(pf, "%s %d %f", s.arr, s.num, s.sc);//這就是如何把格式化的數(shù)據(jù)寫到文件里 //關(guān)閉文件 fclose(pf); pf = NULL; return 0; }
2.格式化的輸入函數(shù)(fscanf)
這樣我們就可以從文件里讀取格式化的數(shù)據(jù)了。
代碼如下:
#include<stdio.h> struct S { char arr[10]; int num; float sc; }; int main() { struct S s = {0}; FILE* pf = fopen("test.dayta", "r"); if (NULL == pf) { return 1; } //寫文件 fscanf(pf, "%s %d %f", s.arr, &(s.num), &(s.sc));//這就是如何把格式化的數(shù)據(jù)寫到文件里 printf("%s %d %f", s.arr, s.num, s.sc); fprintf(stdout, "%s %d %f", s.arr, s.num, s.sc);//這類函數(shù)參數(shù)不同,功能就不同,可以適用于所有的流 //關(guān)閉文件 fclose(pf); pf = NULL; return 0; }
3.二進制讀寫
1.二進制輸出函數(shù)(fwrite)
以二進制的方式把數(shù)據(jù)寫到文件里
代碼如下:
struct S { char arr[10]; int num; float sc; }; int main() { struct S s = {"abcdef",20,5.5f}; FILE* pf = fopen("test.dayta", "w"); if (NULL == pf) { return 1; } //寫文件 fwrite(&s, sizeof(struct S), 1, pf); //關(guān)閉文件 fclose(pf); pf = NULL; return 0; }
2.二進制輸入函數(shù)
以二進制的方式從文件里讀取數(shù)據(jù)
代碼如下:
#include<stdio.h> struct S { char arr[10]; int num; float sc; }; int main() { struct S s = {0}; FILE* pf = fopen("test.dayta", "r"); if (NULL == pf) { return 1; } //寫文件 fread(&s, sizeof(struct S), 1, pf); printf("%s %d %f", s.arr, &(s.num), &(s.sc)); //關(guān)閉文件 fclose(pf); pf = NULL; return 0; }
3.scanf,fscanf,sscanf、printf,fprintf,sprintf的區(qū)別
scanf —? 針對標(biāo)準(zhǔn)輸入的格式化的輸入語句—stdin
fscanf — 針對所有輸入流的格式化的輸入語句 — stdin/文件
sscanf — 從一個字符串中讀取一個格式化的數(shù)據(jù)
printf — 針對標(biāo)準(zhǔn)輸出的格式化語句 — stdout?
fprintf — 針對所有輸出流的格式化輸出語句 — stdout/文件
sprintf — 把一個格式化的數(shù)據(jù),轉(zhuǎn)換成字符串
二、文件的隨機讀寫
1.fseek函數(shù)
fseek函數(shù):根據(jù)文件指針的位置和偏移量來定位文件指針。
代碼如下:
#include<stdio.h> int main() { FILE* pf = fopen("test.data", "r"); if (NULL == pf) { perror("main"); return 1; } //讀取文件 int ch = fgetc(pf); printf("%c\n", ch); //調(diào)整文件 fseek(pf, 2, SEEK_END); int ch = fgetc(pf); printf("%c\n", ch); //關(guān)閉文件 fclose(pf); pf = NULL; return 0; }
2.ftell函數(shù)
ftell函數(shù):返回文件指針相對于起始位置的偏移量(告知偏移量是多少)
3.rewind函數(shù)
rewind函數(shù):讓文件指針的位置回到文件的起始位置
三、被錯誤使用的feof
feof(文件結(jié)束返回非0)
feof應(yīng)用于當(dāng)文件讀取結(jié)束的時候,判斷是讀取失敗結(jié)束,還是遇文件尾結(jié)束
fgetc函數(shù)在讀取結(jié)束的時候,會返回EOF,正常讀取的時候,返回的是讀取到的字符ASCII碼值
fgets函數(shù)在讀取結(jié)束的時候返回NULL,正常讀取的時候返回存放字符串的空間起始地址。
fread函數(shù)在讀取的時候,返回的是實際讀取到的完整元素的個數(shù)。如果發(fā)現(xiàn)讀取到的元素個數(shù)小于指定的元素個數(shù),這就是最后一次讀取了。
寫代碼test.txt文件拷貝一份,生成test2,txt
#include<stdio.h> int main() { FILE* pfread = fopen("test.txt", "r"); if (NULL == pfread) { return 1; } FILE* pfwrite = fopen("test2.txt", "w"); { if (pfread == NULL) { fclose(pfread); pfread = NULL; return 1; } //文件打開成功 //讀寫文件 int ch = 0; while((ch = fgetc(pfread))!= EOF) { //寫文件 fputc(ch, pfwrite); } } //關(guān)閉文件 fclose(pfwrite); pfwrite = NULL; return 0; }
總結(jié)
綜合兩篇文章簡單的介紹了什么是文件,文件的使用和操作方法,學(xué)會文件的使用讓我們能更進一步加深對編程的了解,相信大家都學(xué)會了。如果上述文章有任何問題?,歡迎大佬們提出質(zhì)疑,我會虛心學(xué)習(xí)和改正,最重要的是能共同進步,共同成長,學(xué)習(xí)好編程。
到此這篇關(guān)于C語言超詳細(xì)文件操作基礎(chǔ)下篇的文章就介紹到這了,更多相關(guān)C語言 文件操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++11運算符重載和向量類重載實例詳解(<<,>>,+,-,*等)
這篇文章主要給大家介紹了關(guān)于C++11運算符重載和向量類重載的相關(guān)資料,主要包括<<,>>,+,-,*等,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-07-07C++實現(xiàn)LeetCode(186.翻轉(zhuǎn)字符串中的單詞之二)
這篇文章主要介紹了C++實現(xiàn)LeetCode(186.翻轉(zhuǎn)字符串中的單詞之二),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Java C++算法題解leetcode1592重新排列單詞間的空格
這篇文章主要為大家介紹了Java C++算法題解leetcode1592重新排列單詞間的空格示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09