標準I/O函數之fopen, fread, fwrite,fgetc,fputc

#include <stdio.h>

#define SIZE 1024
/*
I/O緩衝:
有了緩衝機制以後,多個讀寫操作可以合併爲一次系統調用,
減少了系統調用的次數,將大大提高程序的運行效率。


標準I/O中,一個打開的文件稱爲流(stream),
流可以用於讀(輸入流)、寫(輸出流)或讀寫(輸入輸出流)。
每個進程在啓動後就會打開三個流,
分別對應:stdin(標準輸入流)、stdout(標準輸出流)以及stderr(標準錯誤輸出流)
*/


/*
fopen:
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);

"r"或"rb":以只讀方式打開。
"w"或"wb":以只寫方式打開,並把文件長度截短爲零。
"a"或"ab":以寫方式打開,新內容追加在文件尾。
"r+"或"rb+"或"r+b":以更新方式打開(讀和寫)。
"w+"或"wb+"或"w+b":以更新方式打開,並把文件長度截短爲零。
"a+"或"ab+"或"a+b":以更新方式打開,新內容追加在文件尾。

注:字母b表示文件是一個二進制文件而不是文本文件
*/
int main1()
{ 
	//標準I/O函數並不直接操作文件描述符,而是使用文件指針
	//FILE *fp = fopen("fopen.c","w+");
	//FILE *fp = fopen("ffopen.c","a+");
	FILE *fp = fopen("fffopen.c","r+");
	if(fp == NULL)
	{
		perror("fopen ");
		return -1;
	}
	else
	{
		printf("success\n");
	}
	return 0;
}

/*
fread:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    
數據從文件流stream讀到ptr指向的數據緩衝區裏。
size參數指定每個數據記錄的長度,nmemb給出要傳輸的記錄的個數。
函數的返回值是成功讀到數據緩衝區裏的記錄的個數(不是字節數)。
*/

int main2()
{
	FILE *fp = fopen("sqstack.c","ab+");
	if(fp == NULL)
	{
		perror("fopen ");
		return -1;
	}
	
	char buf[SIZE] = {0};

	int ret;
	while(ret = fread (buf,sizeof(char),SIZE-1,fp))
	{
		buf[ret*sizeof(char)] = '\0';
		printf("%s\n",buf);
	}
	//feof()只用於測試流文件的結束,當到達結尾時,返回非0
	if(ret == 0 && !feof(fp))
	{
		perror("fread ");
		return -1;
	}
	printf("read over\n");
	fclose(fp);
	return 0;
}

/*
fwrite()從指定的數據緩衝區裏取出數據記錄,並把它們寫到輸出流中
#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
它的返回值是成功寫入的記錄個數。
*/

int main3()
{
	FILE *fp = fopen("sqstack.c","ab+");
	if(fp == NULL)
	{
		perror("fopen ");
		return -1;
	}
	
	FILE *fp1 = fopen("stack.c","ab+");
	if(fp == NULL)
	{
		perror("fopen ");
		return -1;
	}
	
	char buf[SIZE] = {0};
	
	int ret;
	while(ret = fread (buf,sizeof(char),SIZE-1,fp))
	{
		fwrite (buf,sizeof(char),SIZE-1,fp1);
	}
	//feof()只用於測試流文件的結束,當到達結尾時,返回非0
	if(ret == 0 && !feof(fp))
	{
		perror("fread ");
		return -1;
	}
	printf("read over\n");
	
	fclose(fp);
	fclose(fp1);
	
	return 0;
}
/*
fgetc() :  
從文件流裏取出下一個字節並把它作爲一個字符返回。
當它到達文件結尾或出現錯誤時,返回EOF
#include <stdio.h>
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar(void);

fputc():
fputc()把一個字符寫到一個輸出文件流中,
它返回寫入的值,如果失敗,則返回EOF。
#include <stdio.h>
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);

*/
int main()
{
	FILE *fp = fopen("sqstack.c","ab+");
	if(fp == NULL)
	{
		perror("fopen ");
		return -1;
	}
	
	FILE *fp1 = fopen("qsstack.c","ab+");
	if(fp == NULL)
	{
		perror("fopen ");
		return -1;
	}
	/*
	char buf[SIZE] = {0};

	while(1)
	{
		int c = fgetc(fp);
		if(c == EOF)
			break;
		fputc(c,fp1);
	}
	*/
	

	int c = fgetc(fp);
	while(c != EOF)
	{
		fputc(c,fp1);
		c = fgetc(fp);
	}
	if(feof(fp))
	{
		printf("read over\n");
	}
	else
	{
		printf(" something went wrong\n");
	}

	fclose(fp);
	fclose(fp1);
	return 0;
}



發佈了58 篇原創文章 · 獲贊 12 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章