IO操作是我們程序運行的基礎,數據在程序運行結束時需要保存就必須使用IO操作。IO主要包括兩類:標準IO與系統IO
一 標準IO
標準IO是爲了避免跨平臺移植引起的不必要異常,指定的一系列標準函數,無論linux、windows都可以使用。
標準IO常用API包括:
fopen、fwrite、fread、fclose、prinf、fprintf、fget、fput
等均是以f開頭。
其中:
fopen的mode
r/r+ 是不創建文件,前者只讀,後者可讀寫、
w/w+ 能創建文件,並且把文件置空,前者只寫,後者可讀寫
a/a+ 能創建文件,但不置空文件,在文件末尾寫,前者只寫,後者可讀寫
fputc、fgetc;逐個字節讀寫
fputs、fgets;定義緩衝區,緩衝區填滿後操作。整行讀取
fwrite、fread。以字節位計算長度,按照指定的長度和次數讀取數據,遇到結尾或完成指定長度讀取後停止。
通常標準IO伴隨着FILE結構體。
二 系統調用IO
系統調用IO是標準IO的底層實現,通常受制於所存在的操作系統環境。
系統調用IO常用API包括:
open、close、read、write、lseek
系統調用IO通常伴隨一個文件描述符,是個整型數。通常使用ulimit -n查看。文件描述符是文件指針在一個指針數組中的下標索引位置。該指針數組存在於當前進程的地址空間文件描述符優先使用當前範圍最小的。
三 IO效率比較
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
void fgetcAndFputc()
{
FILE *read, *write;
int ch;
read = fopen("b", "r");
write = fopen("c", "w+");
while(1) {
ch = fgetc(read);
if (ch == EOF) {
break;
}
fputc(ch, write);
}
fclose(write);
fclose(read);
return;
}
void fgetsAndFputs(int size)
{
int buff_size = size;
FILE *read, *write;
read = fopen("b", "r");
write = fopen("c", "w");
char *buf[buff_size];
const char *ch;
while(1) {
ch = fgets(buf, buff_size, read);
if(ch == NULL)
break;
fputs(buf, write);
}
fclose(write);
fclose(read);
puts("OK!");
exit(0);
}
void freadAndFwrite(int size)
{
int buff_size = size;
FILE *read, *write;
read = fopen("b", "r");
write = fopen("c", "w");
char *buf[buff_size];
const char *ch;
while(1) {
ch = fread(buf, 1, buff_size, read);
if(ch <= 0) //end of file
break;
fwrite(buf, 1, ch, write);
}
fclose(write);
fclose(read);
puts("OK!");
exit(0);
}
void removeLine(int line)
{
int fd1, fd2;
fd1 = open("test.c");
fd2 = open("test.c");
lseek(fd1, line, )
}
int main (int argc, char *argv[])
{
freadAndFwrite(atoi(argv[1]));
puts("OK!");
exit(0);
}
IO效率依賴於buffer_size大小。
實驗結果如下,複製一個7030556行162MB大小的文件。
buffer_size | 1 | 8 | 1024 | 10240 |
time | 15.1 | 2.5 | 1.2 | 1.2 |
由此可見buffer_size並非是越大越好,當超過一定閾值時到達系統瓶頸,同樣無法提高IO效率