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