C/C++学习之路_九:文件操作
生活随笔
收集整理的這篇文章主要介紹了
C/C++学习之路_九:文件操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C/C++學習之路_九:文件操作
目錄
1. 概述
1. 磁盤文件和設備文件
2. 磁盤文件的分類
3. 文本文件和二進制文件
文本文件
二進制文件
2 文件的打開和關閉
1. 文件指針
FILE是系統使用typedef定義出來的有關文件信息的一種結構體類型,結構中含有文件名、文件狀態和文件當前位置等信息。
聲明FILE結構體類型的信息包含在頭文件“stdio.h”中,一般設置一個指向FILE類型變量的指針變量,然后通過它來引用這些FILE類型變量。通過文件指針就可對它所指的文件進行各種操作。
C語言中有三個特殊的文件指針由系統默認打開,用戶無需定義即可直接使用:
2. 文件的打開
| r或rb | 以只讀方式打開一個文本文件(不創建文件,若文件不存在則報錯) |
| w或wb | 以寫方式打開文件(如果文件存在則清空文件,文件不存在則創建一個文件) |
| a或ab | 以追加方式打開文件,在末尾添加內容,若文件不存在則創建文件 |
| r+或rb+ | 以可讀、可寫的方式打開文件(不創建新文件) |
| w+或wb+ | 以可讀、可寫的方式打開文件(如果文件存在則清空文件,文件不存在則創建一個文件) |
| a+或ab+ | 以添加方式打開文件,打開文件并在末尾更改文件,若文件不存在則創建文件 |
3. 文件的關閉
2. 文件的順序讀寫
1. 按照字符讀寫文件
1. 寫文件
#include <stdio.h> int fputc(int ch, FILE * stream); 功能:將ch轉換為unsigned char后寫入stream指定的文件中 參數:ch:需要寫入文件的字符stream:文件指針 返回值:成功:成功寫入文件的字符失敗:返回-1 int main() {FILE *fp = NULL;fp = fopen("./test.txt", "w");if (fp == NULL) {perror("open fail!");return -1;}char buf[] = "this is a test for fputc";int i = 0;int n = strlen(buf);for (i = 0; i < n; i++) {//往文件fp寫入字符buf[i]int ch = fputc(buf[i], fp);printf("ch = %c\n", ch);}fclose(fp);return 0; }2. 文件結尾
3. 讀文件
#include <stdio.h> int fgetc(FILE * stream); 功能:從stream指定的文件中讀取一個字符 參數:stream:文件指針 返回值:成功:返回讀取到的字符失敗:-1 char ch;/*while ((ch = fgetc(fp))!=EOF){printf("%c",ch);}printf("\n");*/while (!feof(fp)){ch = fgetc(fp);printf("%c",ch);}printf("\n");2. 按照行讀寫文件
1. 寫文件
#include <stdio.h> int fputs(const char * str, FILE * stream); 功能:將str所指定的字符串寫入到stream指定的文件中,字符串結束符 '\0' 不寫入文件。 參數:str:字符串stream:文件指針 返回值:成功:0失敗:-1 char *buf[] = {"123456\n", "bbbbbbbbbb\n", "ccccccccccc\n"};int i = 0;int n = 3;for (i = 0; i < n; i++) {int len = fputs(buf[i], fp);printf("len = %d\n", len);}2. 讀文件
#include <stdio.h> char * fgets(char * str, int size, FILE * stream); 功能:從stream指定的文件內讀入字符,保存到str所指定的內存空間,直到出現換行字符、讀到文件結尾或是已讀了size - 1個字符為止,最后會自動加上字符 '\0' 作為字符串結束。 參數:str:字符串size:指定最大讀取字符串的長度(size - 1)stream:文件指針 返回值:成功:成功讀取的字符串讀到文件尾或出錯: NULL char buf[100] = {0};while (!feof(fp)) {memset(buf, 0, sizeof(buf));char *p = fgets(buf, sizeof(buf), fp);if (p != NULL) {printf("buf=%s", buf);}}3. 按照格式化文件
1. 寫文件
#include <stdio.h> int fprintf(FILE * stream, const char * format, ...); 功能:根據參數format字符串來轉換并格式化數據,然后將結果輸出到stream指定的文件中,指定出現字符串結束符 '\0' 為止。 參數:stream:已經打開的文件format:字符串格式,用法和printf()一樣 返回值:成功:實際寫入文件的字符個數失敗:-1 fprintf(fp, "%d %d %d\n", 1, 2, 3);2. 讀文件
#include <stdio.h> int fscanf(FILE * stream, const char * format, ...); 功能:從stream指定的文件讀取字符串,并根據參數format字符串來轉換并格式化數據。 參數:stream:已經打開的文件format:字符串格式,用法和scanf()一樣 返回值:成功:參數數目,成功轉換的值的個數失敗: - 1 int a = 0;int b = 0;int c = 0;fscanf(fp, "%d %d %d\n", &a, &b, &c);printf("a = %d, b = %d, c = %d\n", a, b, c);4. 按照塊讀寫文件
1. 寫文件
#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 * nmembstream:已經打開的文件指針 返回值:成功:實際成功寫入文件數據的塊數目,此值和 nmemb 相等失敗:0 typedef struct Stu {char name[50];int id; } Stu;int Write() {FILE *fp = NULL;fp = fopen("./test.txt", "w");if (fp == NULL) {perror("open fail!");return -1;}Stu s[3];for (int i = 0; i < 3; i++) {sprintf(s[i].name, "stu%d%d%d", i, i, i);s[i].id = i + 1;}int ret = fwrite(s, sizeof(Stu), 3, fp);printf("ret=%d\n", ret);fclose(fp);return 0; }2. 讀文件
#include <stdio.h> size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 功能:以數據塊的方式從文件中讀取內容 參數:ptr:存放讀取出來數據的內存空間size: size_t 為 unsigned int類型,此參數指定讀取文件內容的塊數據大小nmemb:讀取文件的塊數,讀取文件數據總大小為:size * nmembstream:已經打開的文件指針 返回值:成功:實際成功讀取到內容的塊數,如果此值比nmemb小,但大于0,說明讀到文件的結尾。失敗:0 Stu s[3];int ret = fread(s, sizeof(Stu), 3, fp);printf("ret=%d\n", ret);for (int i = 0; i < 3; i++) {printf("s = %s, %d", s[i].name, s[i].id);}4. 文件的隨機讀寫
#include <stdio.h> int fseek(FILE *stream, long offset, int whence); 功能:移動文件流(文件光標)的讀寫位置。 參數:stream:已經打開的文件指針offset:根據whence來移動的位移數(偏移量),可以是正數,也可以負數,如果正數,則相對于whence往右移動,如果是負數,則相對于whence往左移動。如果向前移動的字節數超過了文件開頭則出錯返回,如果向后移動的字節數超過了文件末尾,再次寫入時將增大文件尺寸。whence:其取值如下:SEEK_SET:從文件開頭移動offset個字節SEEK_CUR:從當前位置移動offset個字節SEEK_END:從文件末尾移動offset個字節 返回值:成功:0失敗:-1#include <stdio.h> long ftell(FILE *stream); 功能:獲取文件流(文件光標)的讀寫位置。 參數:stream:已經打開的文件指針 返回值:成功:當前文件流(文件光標)的讀寫位置失敗:-1#include <stdio.h> void rewind(FILE *stream); 功能:把文件流(文件光標)的讀寫位置移動到文件開頭。 參數:stream:已經打開的文件指針 返回值:無返回值 FILE *fp = NULL;fp = fopen("./test.txt", "r");if (fp == NULL) {perror("open fail!");return -1;}Stu s[3];Stu tmp;int ret = 0;fseek(fp, 2 * sizeof(Stu), SEEK_SET);ret = fread(&tmp, sizeof(Stu), 1, fp);if (ret == 1) {printf("[tmp]%s, %d\n", tmp.name, tmp.id);}rewind(fp);ret = fread(s, sizeof(Stu), 3, fp);printf("ret = %d\n", ret);int i = 0;for (i = 0; i < 3; i++) {printf("s === %s, %d\n", s[i].name, s[i].id);}5. windows和linux文本
6. 獲取文件狀態
#include <sys/types.h> #include <sys/stat.h> int stat(const char *path, struct stat *buf); 功能:獲取文件狀態信息 參數: path:文件名 buf:保存文件信息的結構體 返回值: 成功:0 失敗-1struct stat {dev_t st_dev; //文件的設備編號ino_t st_ino; //節點mode_t st_mode; //文件的類型和存取的權限nlink_t st_nlink; //連到該文件的硬連接數目,剛建立的文件值為1uid_t st_uid; //用戶IDgid_t st_gid; //組IDdev_t st_rdev; //(設備類型)若此文件為設備文件,則為其設備編號off_t st_size; //文件字節數(文件大小)unsigned long st_blksize; //塊大小(文件系統的I/O 緩沖區大小)unsigned long st_blocks; //塊數time_t st_atime; //最后一次訪問時間time_t st_mtime; //最后一次修改時間time_t st_ctime; //最后一次改變時間(指屬性) };7. 刪除文件、重命名文件
#include <stdio.h> int remove(const char *pathname); 功能:刪除文件 參數:pathname:文件名 返回值:成功:0失敗:-1#include <stdio.h> int rename(const char *oldpath, const char *newpath); 功能:把oldpath的文件名改為newpath 參數: oldpath:舊文件名 newpath:新文件名 返回值: 成功:0 失敗: - 18. 文件緩沖區
1. 文件緩沖區
2. 磁盤文件的存取
3. 更新緩沖區
#include <stdio.h> int fflush(FILE *stream); 功能:更新緩沖區,讓緩沖區的數據立馬寫到文件中。 參數: stream:文件指針 返回值: 成功:0 失敗:-1總結
以上是生活随笔為你收集整理的C/C++学习之路_九:文件操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++学习之路_八: 复合类型
- 下一篇: C/C++学习之路: 智能指针