c語言文件讀寫操作

文件的打開函數fopen()

文件的打開操作表示將給用戶指定的文件在內存分配一個FILE結構區,並將該結構的指針返回給用戶程序,以後用戶程序就可用此FILE指針來實現對指定文件的存取操作了。當使用打開函數時,必須給出文件名、文件操作方式(讀、寫或讀寫),如果該文件名不存在,就意味着建立(只對寫文件而言,對讀文件則出錯),並將文件指針指向文件開頭。若已有一個同名文件存在,則刪除該文件,若無同名文件,則建立該文件,並將文件指針指向文件開頭。

fopen(char *filename,char *type);

其中filename是要打開文件的文件名指針,一般用雙引號括起來的文件名錶示,也可使用雙反斜槓隔開的路徑名。而type參數表示了對打開文件的操作方式。其可採用的操作方式如下: 方式 含義 “r” 打開,只讀; “w” 打開,文件指針指到頭,只寫; “a” 打開,指向文件尾,在已存在文件中追加; “rb” 打開一個二進制文件,只讀; “wb” 打開一個二進制文件,只寫; “ab” 打開一個二進制文件,進行追加 ;“r+” 以讀/寫方式打開一個已存在的文件; “w+” 以讀/寫方式建立一個新的文本文件 ;“a+” 以讀/寫方式打開一個文件文件進行追加 ;“rb+” 以讀/寫方式打開一個二進制文件; “wb+” 以讀/寫方式建立一個新的二進制文件 ;“ab+” 以讀/寫方式打開一個二進制文件進行追加 ;當用fopen()成功的打開一個文件時,該函數將返回一個FILE指針,如果文件打開失敗,將返回一個NULL指針。

關閉文件函數fclose()

文件操作完成後,必須要用fclose()函數進行關閉,這是因爲對打開的文件進行寫入時,若文件緩衝區的空間未被寫入的內容填滿,這些內容不會寫到打開的文件中去而丟失。只有對打開的文件進行關閉操作時,停留在文件緩衝區的內容才能寫到該文件中去,從而使文件完整。再者一旦關閉了文件,該文件對應的FILE結構將被釋放,從而使關閉的文件得到保護,因爲這時對該文件的存取操作將不會進行。文件的關閉也意味着釋放了該文件的緩衝區。

int fclose(FILE *stream);

它表示該函數將關閉FILE指針對應的文件,並返回一個整數值。若成功地關閉了文件,則返回一個0值,否則返回一個非0值。

int read(int handle, void *buf, int count);
read()函數從handle(文件描述字)相連的文件中, 讀取count個字節放到buf所指的緩衝區中, 返回值爲實際所讀字節數, 返回-1表示出錯。返回0 表示文件結束。

write()函數的調用格式爲:
int write(int handle, void *buf, int count);
write()函數把count個字節從buf指向的緩衝區寫入與handle相連的文件中, 返回值爲實際寫入的字節數。

size_t fread( void *buffer, size_t size, size_t count, FILE *stream )
buffer 是讀取的數據存放的內存的指針(可以是數組,也可以是新開闢的空間,buffer就是一個索引)
size 是每次讀取的字節數
count 是讀取次數
stream 是要讀取的文件的指針

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

其中,ptr:指向保存數據的指針;size:每個數據類型的大小;count:數據的個數;stream:文件指針 ; 函數返回寫入數據的個數。

fseek
函數名: fseek
功 能: 重定位流上的文件指針
用 法: int fseek(FILE *stream, long offset, int fromwhere);
描 述: 函數設置文件指針stream的位置。如果執行成功,stream將指向以fromwhere爲基準,偏移offset個字 節的位置。如果執行失敗(比如offset超過文件自身大小),則不改變stream指向的位置。
返回值: 成功,返回0,否則返回其他值。
fromwhere有三個可選值:SEEK_SET 開始 SEEK_CUR現在指針所指的位置 SEEK_END末尾

ftell
用於得到二進制文件位置指針當前位置相對於文件首的偏移字節數。在隨機方式存取文件時,由於文件位置頻繁的前後移動,程序不容易確定文件的當前位置。
long ftell(FILE *stream);

int fprintf(FILE *stream,char *format,variable-list)
int fscanf(FILE *stream,char *format,variable-list)
fprintf()則是向流指針指向的文件輸出;fscanf()是從文件輸入

簡單的例子:先讀取文件內容,再向文件寫數據

#include "pch.h"
#include <iostream>
#include<stdio.h>
#include<stdlib.h>

using namespace std;
int main()
{
	const char *filename ="test.txt";
	FILE *fp;
	//以追加讀寫的方式打開文件
	fopen_s(&fp,"test.txt","ab+");
	if (!fp) {
		printf("open file %s failed!", filename);
	}
	//統計文件大小
	fseek(fp,0,SEEK_END);  
	int len = ftell(fp);
	//若使用fseek,ftell統計文件大小,那麼在獲得大小後要將指針移回原來的位置,因爲fseek會改變指針的位置
	fseek(fp,0,0);  
	//保存從文件中讀去的數據
	char buf[10000] = {0};
	//讀取文件
	fread(buf,len,1,fp);
	//關閉
	fclose(fp); 
	//重新打開,不然會寫入失敗,不知道爲什麼
	fopen_s(&fp, "test.txt", "ab+"); 
	cout << buf << endl;
	//保存寫入文件的內容
	char writebuf[1024];
	char ch = 0;
	int i = 0;
	//讀取輸入字符,以換行符結束
	while ((ch=getchar())!='\n') {
		writebuf[i++] = ch;
	}
	writebuf[i++] = '\n';
	writebuf[i++] = '\0';
	//向文件末尾添加數據
	int flen=fwrite(writebuf,i,1,fp);
	//關閉數據
	fclose(fp);
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章