思維導圖:
一.io的作用
io是實現對文件的操作,把運行結果存到文件中,讀取文件的數據,方便后期查詢。
二.io的概念
io是指系統 和外部設備或用戶之間的數據交互
I:input 表示數據從外部設備輸入到內存中;
O:output表示數據從內存中輸出到外部設備的過程。
三.io的分類
io分為文件io和標準io;
標準io:指程序和用戶之間的數據交互,標準io=文件io+緩沖區
文件io:指程序和系統之間的數據交互
四.文件io和標準io的區別
標準io:
- 滿足ANS的標準,當編譯程序后,可以在不同的編譯環境下執行
- 存在緩沖區,加快訪問速度
- 可移植性強,可以在不同的編譯環境下執行
- 屬于庫函數調用,只可以訪問普通文件
- 標準io操作文件時需要依賴于流指針(FILE*)
文件io
- 滿足POIX標準,只可以在unix操作系統中使用
- 不存在緩沖區,訪問速度慢
- 不可移植,系統調用,依賴系統
- 屬于系統函數調用,可以訪問特殊文件(連接文件,設備文件,管道文件)
- 文件io操作系統時需要依賴文件描述符
五.標準io函數
? ? ? ? 1.流和流指針
-
流:數據一個一個移入或移出緩沖區的過程,稱為字節流
-
流指針FILE*: 本質FILE是一個結構體的別名,當存儲./a.out的運行結果,需要創建一個文件,每常見一個文件則會在用戶空間申請一片緩沖區。緩沖區存在一些信息(緩沖區的首地址,緩沖區的結束地址等)存在流指針
-
注意FILE默認已經存在的,程序員直接使用即可
????????2.查看流指針
- 1.查看數據類型 vi -t 類型 ----》vi -t FILE
- 2.追代碼 ctrl? ? ] (右中括號)
- 3.返回 ctrl t?
? ? ? ? 3.標準io函數
-
1.fopen-------->文件操作:打開,讀取,寫入,關閉。
r 以讀的方式打開文件,流指針指向文件的起始地址,如果文件存在則打開成功,不存在則打開失敗
r+ 以讀寫的方式打開文件. ,流指針指向文件的起始地址,如果文件存在則打開成功,不存在則打開失敗
w 以寫的方式打開文件,如果文件不存在則創建文件,如果文件存在則清空文件
w+ 以讀寫的方式打開文件,如果文件不存在則創建文件,如果文件存在則清空文件
a 以追加的方式打開文件(寫入到文件的結尾)如果文件不存在則創建文件,如果文件存在則流指針指向文件的結尾
a+ 以讀寫(追加)的方式打開文件(寫入到文件的結尾)如果文件不存在則創建文件,如果文件存在則流指針指向文件的結尾
-
2.strerror\perror---------功能:根據錯誤碼,返回一個錯誤碼對應的信息
streeor只返回錯誤信息,沒有詳細信息,perror 返回錯誤信息的同時會給一個提示語句
perror截圖:
? ? ? ? 3.fgetc\fputc
fputc:輸出的函數,對于文件,就是寫入的意思
fgetc:輸入的函數,對于文件,讀取的意思
????????4.fclose
功能:關閉文件
????????5.fseek\rewind\ftell
fseek:功能:設置指針的偏移量(設置光標的位置)
?#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
參數:
stream: 流指針,就是fopen的fp
????????offset: 指針的偏移量,
如果offset>0 ,指針向后偏移
如果offset<0 指針向前偏移
offset=0 指針不偏移
????????whence:
SEEK_SET 把光標設置在起始位置
SEEK_CUR 把光標設置在當前位置
SEEK_END 把光標設置在結尾位置
rewind:把光標設置在起始位置
????????void rewind(FILE *stream);
ftell:獲取當前指針到起始地址之間的文件大小
????????1.把光標設置在文件的結尾 fseek(fp,0,SEEK_END);
????????2.獲取文件大小 long size=ftell(fp)
????????6.fputs\fgets
fputs:功能:從文件流指針中寫入字符串
格式: int fputs(const char *s, FILE *stream);
fgets:功能:從文件流指針中讀取字符串
格式: char *fgets(char *s, int size, FILE *stream);
size: 只可以獲取小于size個字符,最多存儲size-1
六、練習
- 使用標準IO函數,實現文件的拷貝
#include <head1.h>int main(int argc, const char *argv[]){FILE *fp=fopen("IO.text","r");if(NULL==fp){PRINT_ERROR("fopen");}FILE* fp1=fopen("IO.1text","w");//讀取文件,然后寫入while(1 ){char ch=(fgetc(fp));if(EOF==ch){break;}fputc(ch,fp1);}fclose(fp); fclose(fp1); return 0;}
-
使用fgets函數,打印一個文件,類似cat
#include <head1.h>2 int main(int argc, const char *argv[])3 {4 //打開文件5 FILE* fp=fopen("./IO.1text","r");6 if(NULL==fp)7 {8 PRINT_ERROR("fopen");9 }10 11 //讀取數據12 while(1)13 { 14 int res=fgetc(fp);15 if(EOF==res)16 {17 // printf("讀取失敗");18 // return -1;19 break;20 } 21 printf("%c",res);22 } 23 /* int res;24 while((res=fgetc(fp)) != EOF)25 {26 printf("%c",res);27 } 28 */ 29 //關閉文件30 if(fclose(fp)==EOF)31 PRINT_ERROR("fopen");32 33 return 0;34 }
-
計算文件的行數
#include <head1.h>
int main(int argc, const char *argv[])
{//打開文件FILE* fp=fopen("IO.text","r+");if(NULL==fp){ PRINT_ERROR("fopen error");}int count=0;//循環讀取,遇到回車計算行數while(1){ char ch =fgetc(fp);if(ch==EOF){break;}if(ch==10){count++;}}printf("這個文件有%d行\n",count);fclose(fp);return 0;
}
?