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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言:文件操作

發布時間:2024/1/8 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言:文件操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文件操作

系統文件

標準輸入:stdin,編號0,printf-標準輸出
標準輸出:stdout,編號1,scanf-標準輸入
標準錯誤:stderr,編號2,perror-標準錯誤
應用程序啟動時,自動被打開;程序執行結束時,自動被關閉

文件指針
  • 文件指針定義:FILE *fp;
  • 文件指針初始化:fp = fopen();
  • 操作文件:使用文件讀寫函數來完成,fputc,fgets,fputs,fgets,fread,fwrite等
文件分類
  • 設備文件
    屏幕、鍵盤、磁盤、網卡、聲卡、顯卡、揚聲器等
  • 磁盤文件
    文本文件:字符表示數據
    二進制文件:字節表示數據
文件操作步驟
  • 打開文件fopen()
  • FILE* fopen(const char* filename,const char* mode);
    參數1-filename:待打開文件的文件名(訪問路徑)
    參數2-mode:文件操作權限
    返回值:成功返回打開文件的文件指針;失敗返回NULL

    1.mode
    r/rb:以只讀方式打開文件,若文件不存在則報錯
    w/wb:以寫方式打開文件,若文件不存在則新建,若存在則清空
    a/ab:以追加方式打開文件,若文件不存在則新建,若存在則在末尾追加內容
    r+/rb+:以可讀可寫方式打開文件(不創建新文件)
    w+/wb+:以可讀可寫方式打開文件(若文件不存在則新建,若存在則清空)
    a+/ab+:以追加方式打開可讀可寫文件(若文件不存在則新建,若存在則在末尾追加內容)
    2.b是二進制模式的意思,只在windows有效,linux上兩種形式作用一樣
    3.linux下文件行尾以\n結尾,windows下文件行尾以\r\n結尾

  • 讀寫文件

  • 關閉文件fclose()

  • int fclose(FILE* stream);
    參數1-stream:打開文件的文件指針(fopen的返回值)
    返回值:成功0,失敗-1

    訪問路徑
    1.相對路徑
    vs環境下
    編譯執行,文件相對路徑是指相對于工程文件所在文件目錄位置;
    雙擊可執行文件執行,相對路徑指相對于可執行文件所在目錄位置。
    2.絕對路徑:從系統磁盤根盤符開始,到待訪問文件的完整路徑

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>int main(void) {FILE* fp = NULL;//fp = fopen("F:/test/test.txt","r");fp = fopen("F:\\test\\test.txt","r");if (fp == NULL){perror("fopen error");return -1;}fclose(fp);return 0; }
    文件操作函數
    • 按字符寫文件fputc

    int fputc(int ch,FILE* stream);
    參數1-ch:待寫入的字符
    參數2-stream:打開文件的fp
    返回值:寫入成功返回寫入字符的ascii碼,失敗返回-1

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>int main02() {FILE* fp = fopen("F:/test/test.txt","w");if (fp == NULL) {perror("fopen error");return -1;}for (size_t i = 0; i < 26; i++){char ch = fputc('a'+i, fp);if (ch == -1) {perror("fputc error");return -1;}printf("%c", ch);}fclose(fp);return 0; }
    • 按字符讀文件fgetc

    int fgetc(FILE* stream);
    參數:待讀取的文件指針
    返回值:成功返回讀取到的字符的ascii,失敗返回-1;

    文本文件的結束標記:EOF(-1)

    void read_file() {FILE* fp = fopen("F:/test/test.txt", "r");if (fp == NULL) {perror("fopen error");return;}char ch = fgetc(fp);while (ch != -1) {printf("%c ", ch);ch = fgetc(fp);}fclose(fp); }
    • feof

    int feof(FILE* stream);
    函數作用:判斷是否到達文件結尾
    參數:fopen返回值
    返回值:到達文件結尾返回非0【真】,沒有到達文件結尾返回0【假】

    文本文件由ascii組成,asciima范圍是0~127,正文不會出現-1,所以可以用EOF(-1)判斷是否到達結尾;二進制文件正文可能會存在-1,可以使用feof判斷是否到達文件結尾。

    void read_file() {FILE* fp = fopen("F:/test/test.txt", "r");if (fp == NULL) {perror("fopen error");return;}char ch = fgetc(fp);while (1) {if (feof(fp)) {break;}printf("%c ", ch);ch = fgetc(fp);}fclose(fp); }
    • 按行讀寫文件

    char* fgets(char* str,int size,FILE* stream);
    函數功能:從stream指定文件讀取字符串保存到str指定內存空間,直到出現換行或文件尾或已讀size-1個字符為止,末尾自動添加’\0’
    參數1-str:讀取到的字符串
    參數2-size:指定最大讀取字符串長度(size-1)
    參數3-stream:文件指針
    返回值:成功返回讀取到的字符串,讀到文件尾或出錯返回NULL

    int fputs(const char* str,FILE* stream);
    函數功能:將str指定的字符串寫入到stream指定文件中,字符串’\0’不寫入文件
    參數1-str:字符串
    參數2-stream:文件指針
    返回值:成功0,失敗-1

    案例:獲取鍵盤輸入寫入文件

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>int main(void) {FILE* fp = fopen("F:/test/test.txt","a");if (fp == NULL) {perror("fopen error");return -1;}char buf[4096];while (1) {fgets(buf,4096,stdin);if (strcmp(buf, ":wq\n") == 0) {break;}fputs(buf, fp);}fclose(fp);return 0; }
    操作文本文件
    • fprintf():寫指定格式內容到文件中

    int fprintf(FILE* stream,const char* format,...);

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>int main(void) {FILE* fp = fopen("F:/test/test03.c", "w");if (fp == NULL) {perror("fopen error");return -1;}fprintf(fp, "%d%c%d=%d\n", 10, '*', 7, 10 * 7);fclose(fp);return 0; }
    • fscanf():

    int fscanf(FILE* stream,const char* format,...);

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>int main() {FILE* fp = fopen("F:/test/test03.c", "r");if (fp == NULL) {perror("fopen error");return -1;}int a, b, c;char ch;fscanf(fp, "%d%c%d=%d\n", &a, &ch, &b, &c);printf("%d%c%d=%d\n", a, ch, b, c);fclose(fp);return 0; }
    操作二進制文件
    • fwrite():將數據寫入文件

    size_t fwrite(const void* ptr,size_t size,size_t nmemb,FILE* stream);
    參數1-ptr:待寫出數據的地址
    參數2-size:待寫出數據的大小
    參數3-nmemb:寫出次數(size*nmemb=寫出數據總大小)
    參數4-stream:文件
    返回值:成功返回寫入文件次數(參3的值),失敗返回0

    • fread()從文件讀取數據

    size_t fread(const void* ptr,size_t size,size_t nmemb,FILE* stream);
    參數1-ptr:讀取出的數據的存儲的地址
    參數2-size:一次讀取字節數
    參數3-nmemb:讀取次數(size*nmemb=讀出數據總大小)
    參數4-stream:文件
    返回值:成功返回讀取文件次數(參3的值),失敗返回0

    隨機位置讀

    文件讀寫指針,一個文件內只有一個

    • fseek():修改文件指針位置

    int fseek(FILE* stream,long offset,int whence);
    參數1-stream:文件
    參數2-offset:偏移量(+向后,-向前)
    參數3-whence:SEEK_SET(文件開頭),SEEK_CUR(文件當前位置),SEEK_END(文件結尾位置)
    返回值:成功0,失敗-1

    • ftell():獲取文件讀寫指針位置

    long ftell(FILE* stream);
    返回值:從文件當前讀寫位置到起始位置的偏移量

    • rewind():把文件讀寫指針重置到文件開頭

    void rewind(FILE* stream);

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>int main() {FILE* fp = fopen("F:/test/test08.txt", "r+");if (fp == NULL) {perror("fopen error");}char buf[6];fputs("111112222233333", fp);rewind(fp);//文件讀寫指針為同一個,不重置指針會繼續往后讀取數據,從而造成讀不到數據的結果;也可通過fseek修改文件指針位置fgets(buf, 6, fp);printf("buf = %s", buf);fclose(fp);return 0; }
    linux和windows文件區別
  • 對于二進制文件操作,windows下模式要添加"b",linux下二進制和文本文件打開文件模式沒有區別
  • windows下回車是\r,換行是\n,一行結尾的字符是\r\n;linux下回車換行是\n,一行結尾是\n
  • 對文件指針,先寫后讀,windows和linux效果一致;先讀后寫,windows下需要在寫操作之前使用fseek(fp,0,SEEK_CUR)使文件讀寫指針生效,linux無效修改可直接進行寫操作
  • #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>int main(void) {FILE* fp = fopen("F:/test/test08.txt", "r+");if (fp == NULL) {perror("fopen error");return -1;}char buf[6] = {0};char* ptr = fgets(buf, 6, fp);printf("buf=%s,ptr=%s\n", buf,ptr);fseek(fp, 0, SEEK_CUR);//windows下先讀后寫的寫操作前需要使用該函數,linux下不需要使用,可以直接進行寫入int ret = fputs("AAAAA", fp);printf("ret=%d\n", ret);fclose(fp);return 0; }
    獲取文件狀態
    • 獲取文件狀態

    int stat(const char* path,struct stat* buf);
    參數1-path:訪問文件路徑
    參數2-buf:文件屬性結構體
    返回值:成功0,失敗-1

    使用該函數需要使用頭文件:<sys/types.h>、<sys/stat.h>

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include<sys/types.h> #include<sys/stat.h>int main(void) {struct stat buf;int ret = stat("F:/test/test08.txt", &buf);//傳出參數:函數調用完畢時充當函數返回值printf("文件大小:%d\n", buf.st_size);return 0; }
    刪除、重命名文件
    • 刪除文件

    int remove(const char* pathname);

    • 重命名文件

    int rename(const char* oldpath,const char* new path);

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>int main() {//remove("F:/test/test07.txt");rename("F:/test/test05.txt", "F:/test/改名.txt");return 0; }
    緩沖區刷新

    (緩輸出)標準輸出–stdout–標準輸出緩存區:寫給屏幕的數據,先輸出到緩存區,由緩沖區一次性刷新到物理設備(屏幕)

    (預讀入)標準輸入-- stdin–標準輸入緩沖區:從鍵盤讀取的數據直接讀到緩沖區,由緩沖區給程序提供數據

    行緩沖:printf(),遇到\n就會將緩沖區中的數據刷新到物理設備
    全緩沖:文件,緩沖區存滿數據刷新到物理設備
    無緩沖:perror,緩沖區只要有數據就立即刷新到物理設備

    自動刷新緩沖區:文件關閉時緩沖區會被自動刷新

    手動刷新緩沖區:
    int fflush(FILE* stream);
    返回:成功0,失敗-1

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。