標準IO:
標準IO在應用層:比文件IO高級一點,在windows也可以用
標準IO指C語言中提供的標準輸入輸出庫文件所包含的函數。
即stdio.h文件中聲明的函數,都是標準輸入輸出函數。
printf scanf
sprintf sscanf
fprintf fscanf
putchar getchar
puts gets
putc getc
fputs fgets
以終端爲操作對象的標準IO函數:
printf();
函數原型:int printf(const char *format, …);
功能:向終端輸出一個字符串。
優點:輸出格式可以自定義。
scanf();
函數原型:int scanf(const char *format, …);
功能:從終端獲取指定格式的數據,保存到一個變量空間中
優點:獲取輸入數據的格式可以指定。
缺點:如果從終端獲取字符串,遇到空格結束。
puts();
函數原型:int puts(const char *s);
功能:輸出一個字符串。 <僅僅只能輸出字符串內容>
特點:自動在字符串末尾添加換行符
gets();
函數原型:char* gets(char *s);
功能:從終端獲取一個字符串。
特點:獲取字符串時,遇到換行纔會結束。
獲取字符串時,會一直獲取,容易導致緩存區溢出。
scanf()和gets()在終端獲取字符串時,特性對比:
1)scanf()函數從終端獲取字符串,遇到空格結束。
2)gets()函數從終端獲取字符串時,遇到換行纔會結束。
3)scanf()函數從終端獲取字符串時,遇到換行結束獲取,不會讀取換行符,換行符依舊保留在輸入緩存區。
4)gets()函數從終端獲取字符串時,遇到換行結束獲取,最後的換行符也會讀取到。讀取到之後,丟棄換行符
以字符串爲操作對象的標準IO函數:
sprintf();
函數原型:int sprintf(char *str, const char *format, …);
功能:把一個字符串輸出到str指向的緩存區中。
用途:sprintf()主要用於字符串拼接。
例: sprintf(buf, “%s–>%s/%s %d %f is %s”, “hello”, “/dev/”, “a.txt”, …);
例子:將兩個數值拼接到一個字符串
#include <stdio.h>
#include <stdlib.h>
int main()
{
char tem[128]={0};
//溫溼度
int temp=25;
int hum=60;
sprintf(tem,"現在的溫溼度分別是:,溫度%d,溼度%d %%\r\n",temp,hum);
printf("%s\n", tem);
return 0;
}
輸出結果:現在的溫溼度分別是:,溫度25 ,溼度60 %
sscanf();
函數原型:int sscanf(const char *str, const char *format, …);
功能:從str字符串中獲取數據,根據指定格式進行獲取,保存到變量空間中
<以字符串作爲輸入來源>
用途:數據類型轉換。 把字符串轉換爲整型/浮點型/字符型數據
以文件爲操作對象的標準IO函數:
fprintf();
函數原型:int fprintf(FILE *stream, const char *format, …);
功能:把一個字符串輸出到stream指向文件中。對文件進行寫操作!
fscanf();
函數原型:int fscanf(FILE *stream, const char *format, …);
功能:從stream指向的文件中獲取數據,經過格式轉換之後,保存到變量空間中。讀操作!
<以文件作爲數據輸入來源>
fputs();
函數原型:int fputs(const char *s, FILE *stream);
功能:把字符串s輸出到stream指向的文件中。 對文件的寫操作
<輸出重定向到文件中>
fgets();
函數原型:char * fgets(char *s, int size, FILE *stream);
功能:從stream指向文件中獲取數據,最大獲取size-1個,把獲取到的數據保存在s指向的緩存區。
<對文件的讀操作>
形參:
s:存放獲取到數據的緩存區
size:最大獲取數據的字節個數-1。
stream:數據獲取的來源。 <文件/終端>
返回值:
成功:獲取到的字符串首地址
失敗:NULL
對文件寫操作 對文件讀操作
fpirntf(); fscanf();
fputs(); fgets();
重要!標準IO中的文件流指針
文件流指針:FILE*
在標準IO對文件進行操作的時候,使用文件名稱是不能準確指定一個文件,要用文件流指針。
這裏使用文件流指針去指定要操作的文件空間。
文件流指針和文件描述符特性幾乎相同!
文件流指針比文件描述符多了一個緩存特性!
文件流指針中:
stdin:標準輸入 stdout:標準輸出 stderr:標準異常(都是地址)
文件流結構體:
標準IO中的標準文件操作函數
標準IO 文件IO
fopen open
fclose close
fseek ,rewind lseek
fread read
fwrite write
ftell
fopen();
函數原型:FILE* fopen(const char *path, const char *mode);
路徑 讀寫方式(等同於open的flags)
函數功能:根據提供的文件名,得到對應的文件流指針,通過返回值返回。
形參列表:
path:帶路徑的文件名
mode:對文件的操作方式
“r” :只讀 <不能創建文件> 文件必須存在
“w” :只寫 <清空寫> <能夠創建文件>
“a” :只寫 <追加寫> <能夠創建文件>
+讀寫方式
“r+” :讀寫 <覆蓋寫> <不能創建文件>
“w+”:讀寫 <清空寫> <能夠創建文件>
“a+” : 讀寫 <追加寫> <能夠創建文件>
操作總結:
返回值:
成功:文件對應的文件流指針 – fp
失敗:NULL
#include <stdio.h>
int main (int argc, char*argv[])
{
if(argc!=2)
{
printf("請使用格式:%s 文件名\n ",argv[1]);
return -1;
}
FILE *fp= fopen(argv[0], "r");
if(fp == NULL)
{
printf("文件 %s不存在\n",argv[1]);
return -2;
}
printf("成功打開文件%s \n",argv[1]);
return 0;
}
fread();
函數原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE stream);
函數功能:從stream指向的文件中最大讀取sizenmemb個字節的數據,存放到ptr指向的緩存區中
形參列表:
讀到哪: ptr:緩存區 --> 存放從文件中讀取到的數據
讀多少: size:一塊數據的字節數 (一次讀取一塊數據)
一次讀多少塊: nmemb:最大讀取的塊數
從哪讀: stream:文件流指針 --> 指向要操作的文件
返回值:
成功:實際讀取到的完整的塊數
失敗:負數
fwrite();
函數原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
函數功能:提取ptr緩存區中存放的數據,寫入到stream指向的文件中,最大寫入size * nmemb個字節數據
形參列表:
ptr:緩存區 --> 存放着要寫入文件的數據
size:一塊數據的字節數 (一次寫一塊數據),一般寫1
nmemb:最大寫入的塊數 <實際寫入文件的塊數>
stream:文件流指針 --> 指向要操作的文件
返回值:
成功:實際寫入文件數據的完整的塊數
失敗:負數
fseek();
函數原型:int fseek(FILE *stream, long offset, int whence);
函數功能:對文件偏移指針重新定位
形參列表:
stream:文件流指針 – 表示要操作的文件
offset:相對於基準點的偏移距離 (負數:向前偏移 正數:向後偏移)
whence:
重新定位文件偏移指針的基準點
SEEK_SET :
文件開頭
SEEK_CUR:
文件偏移指針當前位置
SEEK_END:
文件末尾
返回值:
成功:0 失敗:-1
ftell();
函數原型:long ftell(FILE *stream);
函數功能:返回文件偏移指針當前位置到文件開頭的距離
形參列表:
stream:文件流指針 – 要操作的文件
返回值:
文件偏移指針當前位置到文件開頭的距離
rewind();
函數原型:void rewind(FILE *stream);
函數功能:把文件偏移指針重新定位到文件開頭。 == fseek(fp, 0, SEEK_SET);
形參列表:
stream:文件流指針 – 要操作的文件
返回值:無
fclose();
函數原型:int fclose(FILE *fp);
函數功能:關閉文件流指針
形參列表:
fp:文件流指針 – 要操作的文件
返回值:
成功:0
失敗:-1