生活随笔
收集整理的這篇文章主要介紹了
一文搞懂C语言文件操作
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、文件分類
根據(jù)數(shù)據(jù)的組織形式,可以將文件分為文本文件和二進(jìn)制文件。通俗講,文本文件就是你能看懂的,而二進(jìn)制文件是你看不懂的!
二、文件打開(kāi)與關(guān)閉
假設(shè)已經(jīng)定義了一個(gè)文件指針
FILE
* fp
;
有了文件指針,意味著你就可以對(duì)文件為所欲為。
用到的函數(shù) fp = fopen(文件名,打開(kāi)模式); fclose(fp); 打開(kāi)模式詳見(jiàn)小甲魚(yú)學(xué)習(xí)網(wǎng)站fopen函數(shù)詳解,講的非常清楚。 案例
int main ( )
{ FILE
* fp
; if ( ( fp
= fopen ( "E:\\data.txt" , "r" ) ) == NULL ) { printf ( "文件打開(kāi)失敗!\n" ) ; exit ( EXIT_FAILURE
) ; } int ch
; while ( ( ch
= getc ( fp
) ) != EOF ) { putchar ( ch
) ; } fclose ( fp
) ; return 0 ;
}
三、文件順序讀寫(xiě)
3.1 讀取寫(xiě)入字符
用到的函數(shù) ch = fgetc(fp) ch:你從文件中讀出的字符 fp:從哪個(gè)文件中讀 fputc(ch,fp) ch:表示往文件中要寫(xiě)入的字符 fp:文件指針,表示要往哪個(gè)文件中寫(xiě)入 案例 將一個(gè)文件中的內(nèi)容拷貝到另一個(gè)文件中
int main ( )
{ FILE
* fp1
; FILE
* fp2
; int ch
; if ( ( fp1
= fopen ( "E:\\data.txt" , "r" ) ) == NULL ) { printf ( "文件打開(kāi)失敗!\n" ) ; exit ( EXIT_FAILURE
) ; } if ( ( fp2
= fopen ( "E:\\copy.txt" , "w" ) ) == NULL ) { printf ( "文件打開(kāi)失敗!\n" ) ; exit ( EXIT_FAILURE
) ; } while ( ( ch
= fgetc ( fp1
) ) != EOF ) { fputc ( ch
, fp2
) ; } fclose ( fp1
) ; fclose ( fp2
) ; return 0 ;
}
3.2 讀取寫(xiě)入字符串
用到的函數(shù) fgets(str,n,fp) str:讀出的字符串存放再str中 n:要讀到的字符個(gè)數(shù),包括字符串結(jié)束符,即只能讀取n-1個(gè)字符 fp:從fp指向文件中讀取 返回值:str的首地址 fputs(str,fp) str:往fp所指文件中寫(xiě)入的字符串地址 fp:往fp指向文件中寫(xiě)入 返回值:若寫(xiě)入成功,返回0;否則,返回EOF 案例1 往一個(gè)文件中先寫(xiě)入字符串,然后再讀取出來(lái)。
int main ( )
{ FILE
* fp
; char buffer
[ N
] ; if ( ( fp
= fopen ( "E:\\test.txt" , "w" ) ) == NULL ) { printf ( "文件打開(kāi)失敗\n" ) ; exit ( EXIT_FAILURE
) ; } fputs ( "I love FishC.com\n" , fp
) ; fputs ( "I love China\n" , fp
) ; fputs ( "I love my parent" , fp
) ; fclose ( fp
) ; if ( ( fp
= fopen ( "E:\\test.txt" , "r" ) ) == NULL ) { printf ( "文件打開(kāi)失敗\n" ) ; exit ( EXIT_FAILURE
) ; } while ( ! feof ( fp
) ) { fgets ( buffer
, N
, fp
) ; printf ( "%s\n" , buffer
) ; } return 0 ;
}
int main ( )
{ FILE
* fp
; char buffer
[ N
] ; if ( ( fp
= fopen ( "E:\\test.txt" , "w" ) ) == NULL ) { printf ( "文件打開(kāi)失敗\n" ) ; exit ( EXIT_FAILURE
) ; } fputs ( "I love FishC.com\n" , fp
) ; fputs ( "I love China\n" , fp
) ; fputs ( "I love my parent\n" , fp
) ; fclose ( fp
) ; if ( ( fp
= fopen ( "E:\\test.txt" , "r" ) ) == NULL ) { printf ( "文件打開(kāi)失敗\n" ) ; exit ( EXIT_FAILURE
) ; } while ( ! feof ( fp
) ) { fgets ( buffer
, N
, fp
) ; printf ( "%s\n" , buffer
) ; } return 0 ;
}
NOTE: 若在讀取字符中遇到EOF,則eof指示器被設(shè)置;但是如果再?zèng)]有讀到任何字符之前就遇到了EOF,則str指示器指向的位置保持原來(lái)的位置不變,即“I love my parent”被讀取了兩次。
3.3 讀取寫(xiě)入一組數(shù)據(jù)
用到的函數(shù) fread(buffer,size,count,fp) buffer:讀取到的數(shù)據(jù)的存放地址 size:要讀取的字節(jié)數(shù) count:要讀取多少個(gè)size字節(jié)的數(shù)據(jù)項(xiàng) fp:從fp指向文件中讀取 fwrite(buffer,size,count,fp) buffer:要寫(xiě)入的數(shù)據(jù)的存放地址 size:要讀取的字節(jié)數(shù) count:要寫(xiě)入多少個(gè)size字節(jié)的數(shù)據(jù)項(xiàng) fp:往fp指向文件中寫(xiě)入 案例 先向一個(gè)文件中吸入一組數(shù)據(jù),然后再讀出。
#include <stdio.h>
#include <stdlib.h>
#define N 3
struct Stu
{ int num
; char name
[ 24 ] ; float score
;
} stu
[ N
] ;
int main ( )
{ FILE
* fp
; int i
; struct Stu temp
; for ( i
= 0 ; i
< N
; i
++ ) { scanf ( "%d %s %f" , & stu
[ i
] . num
, stu
[ i
] . name
, & stu
[ i
] . score
) ; } if ( ( fp
= fopen ( "E:\\test1.txt" , "wb" ) ) == NULL ) { printf ( "文件打開(kāi)失敗\n" ) ; exit ( EXIT_FAILURE
) ; } for ( i
= 0 ; i
< N
; i
++ ) { if ( fwrite ( & stu
[ i
] , sizeof ( struct Stu
) , 1 , fp
) != 1 ) { printf ( "寫(xiě)入文件失敗\n" ) ; } } fclose ( fp
) ; if ( ( fp
= fopen ( "E:\\test1.txt" , "rb" ) ) == NULL ) { printf ( "文件打開(kāi)失敗\n" ) ; exit ( EXIT_FAILURE
) ; } for ( i
= 0 ; i
< N
; i
++ ) { fread ( & temp
, sizeof ( struct Stu
) , 1 , fp
) ; printf ( "num = %d,name = %s,socre = %.2f\n" , temp
. num
, temp
. name
, temp
. score
) ; } fclose ( fp
) ; return 0 ;
}
四、文件隨機(jī)讀寫(xiě)
用到的函數(shù) fseek(文件指針,位移量,起始點(diǎn)) 文件指針:再哪個(gè)文件中進(jìn)行操作 位移量:從起始點(diǎn)開(kāi)始,位置指針移動(dòng)多少 起始點(diǎn):從哪個(gè)位置開(kāi)始 rewind() ftell() 得到位置指針的當(dāng)前位置,用相對(duì)于文件開(kāi)頭的位移量來(lái)表示 案例 先向文件中寫(xiě)入4個(gè)學(xué)生的數(shù)據(jù),然后讀取第2個(gè)學(xué)生的數(shù)據(jù)。
#include <stdio.h>
#include <stdlib.h>
#define N 3
struct Stu
{ int num
; char name
[ 24 ] ; float score
;
} stu
[ N
] , somebody
;
int main ( )
{ FILE
* fp
; int i
; printf ( "請(qǐng)輸入學(xué)生的相關(guān)信息\n" ) ; for ( i
= 0 ; i
< N
; i
++ ) { scanf ( "%d %s %f" , & stu
[ i
] . num
, stu
[ i
] . name
, & stu
[ i
] . score
) ; } if ( ( fp
= fopen ( "E:\\text2.txt" , "w" ) ) == NULL ) { printf ( "文件打開(kāi)失敗\n" ) ; exit ( EXIT_FAILURE
) ; } for ( i
= 0 ; i
< N
; i
++ ) { if ( fwrite ( & stu
[ i
] , sizeof ( struct Stu
) , 1 , fp
) != 1 ) { printf ( "文件打開(kāi)失敗\n" ) ; } } fclose ( fp
) ; if ( ( fp
= fopen ( "E:\\text2.txt" , "r" ) ) == NULL ) { printf ( "文件打開(kāi)失敗\n" ) ; exit ( EXIT_FAILURE
) ; } printf ( "當(dāng)前位置指針:%d\n" , ftell ( fp
) ) ; fseek ( fp
, sizeof ( struct Stu
) , 0 ) ; fread ( & somebody
, sizeof ( struct Stu
) , 1 , fp
) ; printf ( "num = %d, name = %s, score = %f" , somebody
. num
, somebody
. name
, somebody
. score
) ; fclose ( fp
) ; return 0 ;
}
五、其它函數(shù)
其他函數(shù)的詳細(xì)講解,請(qǐng)到小甲魚(yú)(小甲魚(yú)牛逼)的網(wǎng)站上自行學(xué)習(xí)。函數(shù)詳解。
總結(jié)
以上是生活随笔 為你收集整理的一文搞懂C语言文件操作 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。