目錄
- 例1:(使用字符輸出函數fputc)
- 例2:(使用字符輸入函數fgetc)
- 例3:(使用文本行輸出函數fputs )
- 例4:(使用文本行輸入函數fgets )
- 例5:(使用格式化輸出函數fprintf)
- 例6:(使用格式化輸入函數fscanf)
- 例7:(使用二進制輸出函數fwrite)
- 例8:(使用二進制輸入函數fread)
- 補充1:(sprintf函數)
- 補充2:(sscanf函數)
結構:
//主函數
int main()
{//打開文件(寫"w"/讀"r")FILE* pF = fopen("myfile.txt", "w");//判斷文件是否存在if (pF == NULL){perror("fopen");return 1;}//進行寫/讀操作//關閉文件fclose(pF);pF = NULL;return 0;
}
stream
在此例中都為pF
,代表指向標識輸出流的FILE
對象的指針
例1:(使用字符輸出函數fputc)
FILE* pF = fopen("myfile.txt", "w");//使用循環int i = 0;for (i = 0; i < 26; i++){//打印在文件中fputc('a' + i, pF);//打印在屏幕上fputc('a' + i, stdout);}
fputc
的使用:int fputc ( int character, FILE * stream );
- 字符
character
被寫入流stream
的內部位置- 指示器所指示的位置,然后自動向前移動一個。
運行后:
例2:(使用字符輸入函數fgetc)
FILE* pF = fopen("myfile.txt", "r");//讀文件int ch = fgetc(pF);printf("%c\n", ch);ch = fgetc(pF);printf("%c\n", ch);ch = fgetc(pF);printf("%c\n", ch);ch = fgetc(pF);printf("%c\n", ch);
fgetc
的使用:int fgetc ( FILE * stream );
- 返回指定流
stream
的內部文件位置指示符當前指向的字符,然后將內部文件位置指示符推進到下一個字符- 如果流在被調用時位于文件的末尾,則該函數返回
EOF
并為流stream
設置文件結束指示器(feof
)- 如果發生讀錯誤,該函數返回
EOF
并設置流stream
的錯誤指示器(error
)
運行后:
例3:(使用文本行輸出函數fputs )
FILE* pF = fopen("myfile.txt", "w");//寫文本文件fputs("hello word\n", pF);fputs("hello real word\n", pF);//打印在屏幕上fputs("hello word\n", stdout);
fputs
的使用:int fputs ( const char * str, FILE * stream );
- 函數從指定的地址(str)開始復制,直到到達結束的空字符(‘\0’)
- 這個終止的空字符不會復制到流
stream
中fputs
不會寫入額外的字符,換行需要自己加上'\n'
運行后:
例4:(使用文本行輸入函數fgets )
FILE* pF = fopen("myfile.txt", "r");//讀文本文件char arr[10] = { 0 };fgets(arr, 10, pF);printf("%s\n", arr);fgets(arr, 10, pF);printf("%s\n", arr);
fgets
的使用:char * fgets ( char * str, int num, FILE * stream );
- 從流
stream
中讀取字符,并將其作為字符串存儲到str中,直到讀取(num-1)個字符,或者到達換行符或文件結束符,以先發生的為準。- 換行符使
fgets
停止讀取,但它被函數認為是一個有效字符,并包含在復制到str
的字符串中- 若先讀取到(num-1)個字符,則需要自行添加
'\n'
使得在打印屏幕上顯示出換行- 在復制到str的字符之后,將自動追加一個終止null字符
運行后:
例5:(使用格式化輸出函數fprintf)
//結構體
struct S
{int a;float f;
};//主函數FILE* pF = fopen("myfile.txt", "w");//寫文本文件struct S s = { 100,3.14f };//打印在文本內fprintf(pF, "%d %f", s.a, s.f);//打印在屏幕上fprintf(stdout, "%d %f", s.a, s.f);
fprintf
的使用:int fprintf ( FILE * stream, const char * format, ... );
- 與
printf
的區別僅在于形參FILE * stream
- 在
printf
的用法上加上參數流stream
運行后:
例6:(使用格式化輸入函數fscanf)
//結構體
struct S
{int a;float f;
};//主函數FILE* pF = fopen("myfile.txt", "r");//從文本內讀取struct S s = { 100,3.14f };fscanf(pF, "%d %f", &(s.a), &(s.f));//打印在屏幕上printf("%d %f", s.a, s.f);
fscanf
的使用:int fscanf ( FILE * stream, const char * format, ... );
- 與
scanf
的區別僅在于形參FILE * stream
- 在
scanf
的用法上加上參數流stream
運行后:
例7:(使用二進制輸出函數fwrite)
//結構體
struct S
{int a;float f;char str[10];
};
//主函數FILE* pF = fopen("myfile.txt", "wb");//寫文件struct S s = { 100,3.14f,"hello"};fwrite(&s, sizeof(struct S), 1, pF);
fwrite
的使用:size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
- 將由
count
元素組成的數組(每個元素的大小為size
字節)從ptr
所指向的內存塊寫入流stream
中的當前位置- 流
stream
的位置指示器按寫入的總字節數前進- 在內部,該函數將
ptr
指向的塊解釋為unsigned char
類型的(size*count
)元素數組,并將它們順序寫入流stream
運行后:
文本文件中為亂碼的原因:fwrite
寫入文本中的為二進制編碼,無法直接顯示出,用fread
函數可以讀取出
例8:(使用二進制輸入函數fread)
//結構體
struct S
{int a;float f;char str[10];
};
//主函數FILE* pF = fopen("myfile.txt", "rb");//讀文件struct S s = { 0 };fread(&s, sizeof(struct S), 1, pF);printf("%d %f %s\n", s.a, s.f, s.str);
fread
的使用:size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
- 從流
stream
中讀取一個由count
元素組成的數組,每個元素的大小為size
字節,并將它們存儲在ptr
指定的內存塊中- 流
stream
的位置指示器按讀取的總字節數前進- 如果成功讀取的總字節數為(
size*count
)
運用后:
補充1:(sprintf函數)
int sprintf ( char * str, const char * format, ... );
將格式化的數據,轉換為字符串
- 如果在
printf
上使用format
,則使用將打印的相同文本組成一個字符串,但不是打印,而是將內容作為字符串存儲在str
指向的緩沖區中- 緩沖區的大小應該大到足以包含整個結果字符串
- 在內容之后自動附加一個終止
null
字符
struct S
{int a;float f;char str[10];
};
int main()
{char arr[30] = { 0 };struct S s = { 100,3.14f,"hehe"};sprintf(arr, "%d %f %s", s.a, s.f, s.str);printf("%s\n", arr);return 0;
}
將結構體
struct S s
中的數據按照"%d %f %s"
的格式,轉化為字符串存儲在arr
指向的緩沖區中
觀察arr
內的變化
補充2:(sscanf函數)
int sscanf ( const char * s, const char * format, ...);
從字符串中讀取格式化的數據
- 從
s
中讀取數據,并根據參數格式將其存儲到附加參數給出的位置,就像使用了scanf
一樣,但從s
中讀取數據,而不是從標準輸入(stdin
)中讀取- 額外的參數應該指向已經分配的對象,其類型由格式字符串中相應的格式說明符指定
struct S
{int a;float f;char str[10];
};
int main()
{char arr[30] = { 0 };struct S s = { 100,3.14f,"hehe" };struct S tmp = { 0 };sprintf(arr, "%d %f %s", s.a, s.f, s.str);sscanf(arr, "%d %f %s", &(tmp.a), &(tmp.f), tmp.str);printf("%d %f %s\n", tmp.a, tmp.f, tmp.str);return 0;
}
從
arr
中讀取數據,由"%d %f %s"
的格式字符串中相應的格式說明符指定分配到結構體struct S tmp
中
觀察數據變化