1. 程式人生 > >I/O函式介紹

I/O函式介紹

##流
什麼是流?

C裡的檔案流,C裡標準檔案方式把檔案當作流來看,也就是有一個內部緩衝buffer,每次以標準方式開啟檔案時,讀入時先將資料讀到這個緩衝區裡,寫的時候也是先寫入緩衝區裡。
流分為兩種:文字流和二進位制流
1.文字流在不同的系統中實現不太相同。
2.二進位制流中的位元組完全是安照程式編寫的形式寫入到檔案和裝置中,而且完全根據他們從檔案或者裝置讀取的方式讀入到程式。
##檔案
  說起檔案,很多人就會想到在stdio.h裡面定義了一個FILE的結構,但是在這裡,我要說明的是,千萬不要把它和磁碟上的檔案混淆,我之前就總是認為FILE嘛,不就是個檔案嘛!再次宣告,絕對不是!!!
  FILE是一種資料結構,用於訪問一個流,如果你激活了幾個流,那麼每個流都會對應一個FILE結構。
  對於每一個ANSI C程式而言,至少開啟三個流:標準輸入(stdin)、標準輸出(stdout)、標準錯誤(stderr),它們都是指向FILE結構的指標。
 注:標準輸入就是鍵盤裝置輸入進去      標準輸出就是螢幕終端顯示的 ##常見的I/O常量     最常見的也是我們所熟知的必定是EOF了,它是檔案結束的標誌,表示檔案到了結尾。 此外還有一些其他的I/O常量: FOPEN_MAX 表示一個程式最多開啟檔案數。 FILENAME_MAX表示檔名稱的最大長度。 ##I/O函式 ######檔案I/O的一般概況:
1.程式必須給每個檔案宣告一個指標變數,這個變數的型別為FILE*,當它處於活動狀態時為流所用。
2.流通過fopen函式開啟,開啟的時候必須指定需要訪問的檔案或者裝置以及訪問方式。例如:
`FILE* fopen(const char* filename,const char*mode)`
3.根據需要對檔案進行讀取和寫入。
4.fclose函式可以關閉流,防止與它相關的檔案再次被訪問,保證儲存在緩衝區的資料被正確的寫入到檔案中。例如:
`fclose(FILE* steam)` ######I/O函式列表:
</tbody>
功能 函式名 適用於
字元輸入函式 getchar 標準輸入流
字元輸出函式 putchar 標準輸出流
字元輸入函式 fgetc  getc 所有輸入流
字元輸出函式 fputc  putc 所有輸出流
文字行輸入函式 fgtes  gets 所有輸入流
文字行輸出函式 fputs  puts 所有輸出流
格式化輸入函式 scanf 標準輸入流
格式化輸出函式 printf 標準輸出流
格式化輸入函式 fscanf 所有輸入流
格式化輸出函式 fprintf 所有輸出流
二進位制輸入 fread 檔案
二進位制輸出 fwrite 檔案
##字元I/O 1. getchar和putchar函式 適用於標準輸入流和標準輸出流 例如: ``` #include

putc:

C 庫函式 int putc(int char, FILE *stream) 把引數 char 指定的字元(一個無符號字元)寫入到指定的流 stream 中。
//putc例項:
#include<stdio.h>
int main()
{
	FILE *pf;
	char c;
	pf = fopen("my file.txt", "wt");
	for (c = 'A'; c <= 'Z'; c++)
	{
		putc(c, pf);
	}
	fclose(pf);
	return 0;
}

這裡寫圖片描述
這裡寫圖片描述
getc

int getc(FILE *stream);從檔案指標stream指向的檔案流中讀取一個字元。
#include<stdio.h>
int main()
{
	FILE *pf;
	char c;
	int n = 0;
	pf = fopen("my file.txt", "r");
	if (pf == NULL)
	{
		perror("Error opening file");
	}
	else
	{
		while (c = getc(pf) != EOF)
		{
			n++;
		}
	}
	
	fclose(pf);
	printf("檔案包含%d個字元\n", n);
	return 0;
}

這裡寫圖片描述
3. fgetc和fputc函式
適用於所有輸入流和輸出流

int fgetc( FILE *stream );
int fputc( int c, FILE *stream );

getc和fgetc功能一樣
putc和fputc功能一樣
#####未格式化的行I/O 4. gets和puts函式 ``` char *gets( char *buffer ); int puts( const char *string ); ``` gets
#include<stdio.h>
int main()
{
	char string[256];
	printf("請輸入一個城市:");
	gets(string);
	printf("%s是一座古都\n",string);
	return 0;
}

這裡寫圖片描述
puts

#include<stdio.h>
int main()
{
	char string[256] = {"hello,world"};
	puts(string);
	return 0;
}

這裡寫圖片描述
5.fgets和fputs函式

int fputs( const char *string, FILE *stream );
char *fgets( char *string, int n, FILE *stream );

fgets

#include<stdio.h>
int main()
{
	FILE *pf;
	char string[100];
	pf = fopen("my file.txt", "r");
	if (pf == NULL)
	{
		perror("open  file  for read");
	}
	else
	{
		if (fgets(string, 100, pf) != NULL)
		{
			puts(string);
			fclose(pf);
		}
	}
	return 0;
}

這裡寫圖片描述

fputs

#include<stdio.h>
int main()
{
	FILE *pf;
	char string[256];
	printf("請輸入一句話:");
	fgets(string, 256, stdin);
	pf = fopen("my file.txt", "a");
	fputs(string, pf);
	fclose(pf);
	return 0;
}

這裡寫圖片描述
這裡寫圖片描述
####格式化的行I/O
6.scanf和printf函式

int scanf( const char *format [,argument]... );
int printf( const char *format [, argument]... );

這兩個函式是我們所熟知且熟用的函數了!在這裡不多做說明

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	printf("請輸入a和b的值");
	scanf("%d%d", &a, &b);
	printf("%d+%d=%d", a, b, a + b);
	return 0;
}

這裡寫圖片描述