#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;
}
標準I/O函數之fopen, fread, fwrite,fgetc,fputc
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.