C语言中怎么用iomainp文件,C語言I/O文件操作總結

/******************************************************************

***  標准I/O庫

*** 對於標准I/O庫,它們的操作是圍繞流(stream)進行的

*** 用標准I/O庫打開或者創建一個文件時,我們就將一

*** 個流和一個文件相關聯

******************************************************************/

對於ASCII字符集,一個字符用一個字節表示。對於國際字符集,一個字符可用多個字節表示。標准I/O文件流可用於單字節或多字節(“寬”)字符集。流的定向決定了所讀、所寫字符是單字節還是多字節。當一個流最初被創建時,它並沒有定向。如若在未定向的流上使用一個多字節I/O函數,則將該流的定向設置為寬定向的。若在未定向的流上使用一個單字節I/O函數,則將該流的定向設置為字節定向的。

只有兩個函數可以改變流的定向。freopen函數清除一個流的定向;fwide函數設置流的定向。

#include

int fwide(FILE *fp,int mode);

若mode參數值為負,fwide將試圖使指定的流是字節定向的。

若mode參數值為正,fwide將試圖使指定的流是寬定向的。

若mode參數值為0,fwide將不試圖設置流的定向,但返回標識該流定向的值

三種標准輸入、輸出、出錯:

stdin

stdout

stderr

緩沖:

標准I/O提供了三種類型的緩沖

(1)全緩沖:在填滿標准I/O緩沖區后才進行實際I/O操作。對於駐留在磁盤上的文件通常采用全緩沖。在一個流上執行第一次I/O操作時,相關標准I/O函數通常調用malloc函數獲得需使用的緩沖區。

(2)行緩沖。當在輸入和輸出中遇到換行符時,標准I/O庫執行I/O操作。當流涉及一個終端時,通常使用行緩沖。

對於行緩沖有兩個限制:

第一、因為標准I/O庫用來收集每一行的緩沖區的長度是固定的,所以只要填滿了緩沖區,那么即使還沒有寫一個換行符,也進行I/O操作。

第二、任何時候只要通過標准I/O庫要求從一個不帶緩沖的流,或者一個行緩沖的流得到數據,那么就會造成沖洗所有行緩沖輸出流。

(3) 不帶緩沖。標准庫不對字符進行緩沖存儲。標准出錯流通常是不帶緩沖的。

void setbuf(FILE *restrict fp, char *restrict buf);

int setvbuf(FILE *restrict fp, char *restrict buf, int mode, size_t size);

setbuf函數打開或者關閉緩沖機制,參數buf是一個指定長度為BUFSIZ的緩沖區。buf設置為NULL ,則表示關閉緩沖區。

setvbuf函數可以精確的指定所需的緩沖類型。這是用mode參數實現的:

mode:

_IOFBF 全緩沖

_IOLBF 行緩沖

_IONBF 不帶緩沖

如果指定一個不帶緩沖區的流,則忽略buf和size參數。如果指定全緩沖或行緩沖,則buf和size可以選擇的指定一個緩沖區和長度,如果該流是帶緩沖的,而buf是NULL,則標准I/O庫將自動的分配適當長度的緩沖區。適當長度指的是由常量BUFSIZ所指定的值。

打開流:

FILE *fopen(const char *restrict pathname,const char *restrict type);

FILE *freopen(const char *restrict pathname,const char *restrict type,FILE *restrict fp);

FILE *fdopen(int filedes,const char *type);

三個函數成功返回文件指針,失敗返回NULL

(1)、fopen打開一個指定的文件

(2)、freopen在一個指定的流上打開一個指定的文件,如若該流已經打開,則先關閉該流。若該流已經定向,則freopen清除該定向。此函數一般用於將一個指定的文件打開為一個預定義的流:標准輸入、標准輸出或標准出錯;

(3)、fdopen獲取一個現有的文件描述符,並使一個標准的I/O流與該描述符相結合。此函數常用於由創建管道和網絡通信通道函數返回的描述符。因為這些特殊類型的文件不能用標准I/O fopen打開,所以我們必須先調用設備專用的函數以獲得一個文件描述符,然后用fdopen使一個標准I/O流與該描述符相關聯。

type參數是對該I/O流的讀、寫方式

讀和寫流:

一旦打開了流,則可以在三種不同類型的非格式I/O中進行選擇,對其進行讀寫:

1.每次一個字符的I/O。 一次讀或寫一個字符,如果流是帶緩沖的,則標准I/O函數會處理所有緩沖。

2.每次一行的I/O。 如果想要一次讀或者寫一行數據,則適用fgets和fputs。每行都以一個換行符終止。當調用fgets時,應說明能處理的最大行長。

3.直接I/O。fread和fwrite函數支持這種類型的I/O。每次I/O操作讀或寫某種數量的對象,而每個對象具有指定的長度。這兩個函數常用於從二進制文件中每次讀或寫一個結構。

一、每次一個字符的I/O:

1.輸入函數:

int getc(FILE *fp);

int fgets(FILE *fp);

int getchar(void); //等價於getc(stdin)

這三個函數成功則返回下一個字符,到達文件尾或者出錯返回EOF 為了 區分不同情況必須調用一下函數:

int ferror(FILE *fp);

int feof(FILE *fp);

成功返回非零,否則返回0

在大多數實現中,為每個流在FILE對象中維持了兩個標志:

出錯標志 和文件結束標志

void clearerr(FILE *fp);//清空錯誤標志和文件結束標志:

從流中讀取數據之后,可以調用ungetc將字符再壓送會流中

int ungetc(int c,FILE *fp); //成功返回c 否則返回EOF

2.輸出函數:

int putc(int c,FILE *fp);

int fputc(int c,FILE *fp);

int putchar(int c);

三個函數成功返回c 失敗返回EOF

二、每次一行的I/O

1.輸入函數:

char *fgets(char *restrict buf,int n,FILE *restrict fp);

char *gets(char *buf); //從標准輸入讀。

兩個函數成功返回buf,失敗返回NULL

fgets 需要指明緩沖區buf的長度n,此函數一直讀到換行符為止,讀入的數據不能超多n-1個字符,否則讀入的將是一個不完整的字符串。buf以NULL結尾。

2.輸出函數:

int puts(const char *str);//將一個以null結尾的字符串寫到標准輸出,null不寫出。

int fputs(const char *restrict str,FILE *fp);

兩個函數成功返回非負值,出錯返回EOF

三、二進制I/O

size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);

size_t fwrite(const void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);

兩個函數返回成功讀取或者寫入的對象數。

ptr 為要讀入或者寫入的數據緩沖區, size為 每個對象的字節數, nobj為要讀取或者寫入的個數,fp為指定的流。

四、格式化I/O

1.格式化輸出:

int printf(const char *restrict format, ...);

int fprintf(FIlE *restrict fp, const *restrict format, ...);

//兩個函數 成功返回輸出字符數,出錯返回負值。

int sprintf(char *restrict buf,const char *restrict format, ...);

int snprintf(char *restrict buf, size_t n, const char *restrict format, ...);

//兩個函數 成功返回存入buf中的字符數,若編碼出錯則返回負值。

2.格式化輸入:

int scanf(const char *restrict format, ... );

int fscanf(FILE *restrict fp, const char *restrict format, ...):

int sscanf(const char *restrict buf, const char *restrict format, ...):

成功返回輸入的項數,否則返回EOF

五、 定位流

有三種方式定位標准I/O流

1. ftell和fseek函數:

long ftell (FILE *fp);//成功返回當前文件位置,出錯返回-1

int fseek (FILE *fp, long offset, int whence); //成功返回0,失敗返回非零值

void rewind(FILE *fp);//將流設置到文件的起始位置

whence 的取值:

SEEK_SET---------表示從文件的起始位置開始

SEEK_CUR---------表示從文件的當前位置開始

SEEK_END---------表示從文件的結束位置開始

offset 值可正可負;

2. ftello 和 fseeko函數:

off_t ftello(FILE *fp);//成功返回當前文件位置,出錯返回-1

int  fseeko(FILE *fp, off_t offset, int whence);//成功返回0,失敗返回非零值

和ftell與fseek函數相同;

3. fgetpos和fsetpos函數

int fgetpos(FILE *restrict fp, fpos_t *restrict pos);

int fsetpos(FILE *fp, const fpos_t pos);

兩個函數成功返回0,失敗返回非零值

fgetpos將文件位置指示器的當前值存入有pos指向的對象中。在以后調用fsetpos時,可以用此值將流重新定位到該位置。

六、其他

int fileno(FILE *fp); //返回與該流相關聯的文件描述符

臨時文件:

char *tmpnam(char *ptr);//返回唯一路徑名的指針

FILE *tmpfile(void);//成功返回文件指針,出錯返回NULL

tmpnam函數產生一個與現有文件名不同的一個有效路徑名字符串。每次調用都產生一個不同的路徑名。最多調用TMP_MAX次。

若ptr是NULL,則所產生的路徑名存放在一個靜態區中,指向該靜態區的指針作為函數值返回,下一次調用tmpnam時,會重寫該靜態區(這意味着,如果我們調用此函數多次,而且想保存路徑名,則我們應當保存該路徑名的副本,而不是指針的副本)。若ptr不是NULL,則認為它指向長度至少時L_tmpnam個字符的數組(常量L_tmpnam定義在頭文件stdio.h中),所產生的路徑名存放在該數組中,ptr也作為函數值返回。

tmpfile創建一個臨時二進制文件(類型wb+),在關閉文件或者程序結束時將自動刪除這種文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值