1. 程式人生 > >Linux C程式設計——基於流的I/O操作

Linux C程式設計——基於流的I/O操作

1、基於字元的I/O

基於字元的I/O通常是用來處理單個字元的。

 

(1)字元的輸入

以下三個函式用於一次讀入一個字元:

#include <stdio.h>

Int getc(FILE *fp);

Int fgetc(FILE *fp);

Int getchar(void);

3個函式的返回:若成功則返回讀入字元的值,若已處檔案尾端或出錯則為EOF

 

(2)字元的輸出

#include<stdio.h>

Int putc(int c  ,FILE *fp);

Int fputc(int c ,FILE *fp);

Int putchar(int c);

 

三個函式返回:若成功則為c,若出錯則為EOF

 

2、基於行的I/O

當輸入中的內容遇到‘\n’換行符的時候,則將流中'\n'之前的內容送到緩衝區中的I/O方式稱為基於行的I/O,即每次一行的I/O。

 

(1)行的輸入

Fgets 和gets函式實現輸入一行字串

#include<stdio.h>

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

Char *gets(char *buf);

兩個函式的返回:若成功則返回緩衝區中的首地址,若已處檔案尾或出錯則為NULL;

 

(2)行的輸出

fputs和puts函式實現輸出一行字串

#include<stdio.h>

Int fputs(const char *buf,FILE *restrict fp);

Int puts(const char *str);

 

3、直接I/O

二進位制I/O操作

#include<stdio.h>

Size_t fread(void *ptr,size_t size,size_t nmemb,FILE *fp);

Size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *fp);

兩個函式的返回:讀或寫的物件數

     fread函式用於執行直接輸出操作。引數ptr是指向讀取資料的緩衝區的指標,size是讀取物件的大小,nmemb表示欲讀取的物件的個數,fp是指向要讀取的流的FILE結構指標。

   

     fwrite函式用於執行直接輸入操作。引數ptr是指向存放將要輸入資料的緩衝區的指標,size是寫入物件的大小,nmemb表示欲寫入的物件的個數,fp是指向要寫入的流的FILE結構指標。

 

這些函式有兩種常見的用法:

1)讀或寫一個二進位制陣列。例如:將一個浮點型陣列的第2~5個元素寫到一個檔案上。:

Float data[10];

if(fwrite(&data[2],sizeof(float),4,fp)!=4)

  printf(“fwrite error !\n”);

 

2)讀或寫一個結構

struct{

  short count;

 long total;

Char name[NAME_SIZE];

}item;

  if(fwrite(&item,sizeof(item),1,fp)!=1)

     printf(“fwrite error !\n”);

 

 

3、格式化I/O

基於流的I/O操作的一個最大的特點就是它可以實現格式化的輸入輸出(基於字元和行的I/O,以及直接I/O統稱為非格式化I/O)。格式化I/O是最常見的I/O方式,比如我們常見的printf和scanf。

(1)格式化輸出

執行格式化輸出處理的是4個printf函式

#include<stdio.h>

Int printf(const char *format,……);

Int fprintf(FILE *fp,const char * format,……);

兩個函式的返回:若成功則為實際輸出的字元數,若輸出出錯則為負值;

 

Int sprintf(char *str,const char*format,……);

Int snprintf(char *str,size_t size,const char *format,……);

兩個函式的返回:若成功則為實際存入快取的字元數,若出錯則為負值

 

(2)格式化輸入

執行格式化輸入處理的是3個scanf函式

#include<stdio.h>

 

Int scanf(const char *format);

Int fscanf(FILE *fp,const char *format,……);

Int sscanf(char *str,const char *format,……);

3個函式的返回:若成功則返回指定的輸入項數,若輸入出錯,或在任意變換前已至檔案尾端則為EOF