Linux系統編程4標準IO - fgetc和fputc

實驗1 以字符拷貝的方式,fgetc,fputc 實現 cp 命令,mycpy,格式是 ./mycpy srcfile destfile

實驗2 利用 fgetc()查看一個文件中有多少個有效字符


1 字符的輸入 fgetc, getc, getchar

字符的輸入:fgetc, getc, getchar

NAME
fgetc, getc, getchar, - input of characters ,字符的輸入

SYNOPSIS
#include <stdio.h>

   int fgetc(FILE *stream); //以整型來接收讀到的字符
   int getc(FILE *stream);  //以整型來接收讀到的字符
   int getchar(void);

DESCRIPTION

fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.

從任何成功打開的流中獲取內容,包括標準輸入以及已經存在的文件中。fgetc()會被定義成函數來使用,以整型來接收讀到的字符


getc() is equivalent to fgetc() except that it may be implemented as a macro which evaluates stream more than once.
從任何成功打開的流中獲取內容,包括標準輸入以及已經存在的文件中。getc()會被定義成宏使用


getchar() is equivalent to getc(stdin).
從標準輸入讀入一個字符(函數參數是標準輸入,即終端)


返回值

fgetc(), getc() and getchar() return the character read as an unsigned char cast to an int or EOF on end of file or error.

返回 以整型來接收讀到的字符,讀到文件尾端或者讀取失敗則返回 EOF

注意:函數和宏的區別:
內核鏈表通篇都是宏來實現的,除了inline內聯函數就是宏,沒有用函數,這樣做的目的是節約時間,宏不佔用調用時間,只佔用編譯時間。函數的調動 只佔用調用時間,不佔用編譯時間。內核這樣的實現是爲了節約時間,在對時間要求非常高的情況,如汽車的安全氣囊,是不允許氣囊晚一點點時間彈出來的。

2 字符的輸出:fputc,fputc,putchar

NAME
fputc, putc, putchar - output of characters,字符的輸出

SYNOPSIS
#include <stdio.h>

   int fputc(int c, FILE *stream);
   int putc(int c, FILE *stream);
   int putchar(int c);

DESCRIPTION

fputc() writes the character c, cast to an unsigned char, to stream.
將指定輸出項 輸出到一個指定流上,包括標準輸出流,標準出錯流,以及任何一個已經成功打開的流(文件),將轉換爲無符號字符的字符C寫入流


putc() is equivalent to fputc() except that it may be implemented as a macro which evaluates stream more than once.

將指定輸出項 輸出到一個指定流上,包括標準輸出流,以及任何一個已經成功打開的流(文件),它可以作爲一個宏來實現


putchar© is equivalent to putc(c, stdout).
把指定的字符輸出到標準輸出(即終端)


實驗1 以字符拷貝的方式,fgetc,fputc 實現 cp 命令,mycpy,格式是 ./mycpy srcfile destfile

利用命令行傳參:

#include<stdio.h>
#include<stdlib.h>

int main(int argc,char *argv[])
//int main(int argc,char **argv)
{
	FILE *fps=NULL;
FILE *fpd=NULL;
	int ch=0;

//檢查命令行參數
	if(argc < 3)
	{
//向標準錯誤報錯
	fprintf(stderr,"Usage:%s <src_file> <dest_file>\n",argv[0]);
	exit(1);//結束
	}

/* 以只讀的形式打開流
原因1:保證流必須存在,
原因2:不允許改變流 srcfile的內容
*/
	fps = fopen(argv[1],"r");//這裏的argv[1] 即命令行參數中的源文件 srcfile
	if(fps == NULL)
	{
		perror("fopen()");
		exit(1);
	}

	fpd = fopen(argv[2],"w");
	if(fpd == NULL)
	{	
 fclose(fps);//避免內存泄漏
		perror("fopen()");
		exit(1);
	}

	while(1)
	{
		ch = fgetc(fps);
//如果讀到文件尾端或者讀取失敗,退出
		if(ch == EOF)
			break;
 //將讀到的字符寫入目標流
		fputc(ch,fpd);
	}

//先關閉 目的文件,再關閉源文件
	fclose(fpd);
	fclose(fps);
}

mhr@ubuntu:~/work/linux/stdio/mycpy$ gcc mycpy.c 
mhr@ubuntu:~/work/linux/stdio/mycpy$ ll
total 28
drwxrwxr-x 2 mhr mhr 4096 Apr 19 03:36 ./
drwxrwxr-x 3 mhr mhr 4096 Apr 19 03:32 ../
-rwxrwxr-x 1 mhr mhr 8864 Apr 19 03:36 a.out*
-rw-rw-r-- 1 mhr mhr  407 Apr 19 03:34 mycpy.c
-rw-rw-r-- 1 mhr mhr   11 Apr 19 03:36 test1
-rw-rw-r-- 1 mhr mhr    0 Apr 19 03:33 test2
mhr@ubuntu:~/work/linux/stdio/mycpy$ 
mhr@ubuntu:~/work/linux/stdio/mycpy$ ./a.out test1 test2
mhr@ubuntu:~/work/linux/stdio/mycpy$ ll
total 32
drwxrwxr-x 2 mhr mhr 4096 Apr 19 03:36 ./
drwxrwxr-x 3 mhr mhr 4096 Apr 19 03:32 ../
-rwxrwxr-x 1 mhr mhr 8864 Apr 19 03:36 a.out*
-rw-rw-r-- 1 mhr mhr  407 Apr 19 03:34 mycpy.c
-rw-rw-r-- 1 mhr mhr   11 Apr 19 03:36 test1
-rw-rw-r-- 1 mhr mhr   11 Apr 19 03:36 test2
mhr@ubuntu:~/work/linux/stdio/mycpy$ 
mhr@ubuntu:~/work/linux/stdio/mycpy$ diff test1 test2
mhr@ubuntu:~/work/linux/stdio/mycpy$ 
mhr@ubuntu:~/work/linux/stdio/mycpy$ ./a.out 
Usage:./a.out <src_file> <dest_file>
mhr@ubuntu:~/work/linux/stdio/mycpy$ 

可以查看 讀出來或者寫進去的 ch值,即

printf("write char character = %d\n",ch);
或
printf("write char character = %c\n",ch);

mhr@ubuntu:~/work/linux/stdio/mycpy$ gcc mycpy.c 
mhr@ubuntu:~/work/linux/stdio/mycpy$ ./a.out test1 test2
write char character = 48
write char character = 49
write char character = 50
write char character = 51
write char character = 52
write char character = 53
write char character = 54
write char character = 55
write char character = 56
write char character = 57
write char character = 10
mhr@ubuntu:~/work/linux/stdio/mycpy$ 
mhr@ubuntu:~/work/linux/stdio/mycpy$ gcc mycpy.c 
mhr@ubuntu:~/work/linux/stdio/mycpy$ ./a.out test1 test2
write char character = 0
write char character = 1
write char character = 2
write char character = 3
write char character = 4
write char character = 5
write char character = 6
write char character = 7
write char character = 8
write char character = 9
write char character = 

mhr@ubuntu:~/work/linux/stdio/mycpy$ 

實驗2 利用 fgetc()查看一個文件中有多少個有效字符

#include<stdio.h>
#include<stdlib.h>

int main(int argc,char *argv[])
{
	FILE *fp =NULL;

//此時實驗是小文件,用int 計算文件中字符個數不會溢出。如果是大文件 可以用long
	int count = 0;

	if(argc < 2)
	{
	fprintf(stderr,"Usage:%s <src_file> <dest_file>\n",argv[0]);
	exit(1);
	}
	
	fp = fopen(argv[1],"r");
	if(fp == NULL)
	{
		perror("fopen()");
		exit(1);
	}
	
//如果讀到文件尾
	while(fgetc(fp) != EOF)
	{
		count ++;
	}

	printf("count = %d\n",count);
	fclose(fp);
	exit(0);
}

mhr@ubuntu:~/work/linux/stdio$ ll
total 44
drwxrwxr-x 3 mhr mhr 4096 Apr 19 03:57 ./
drwxrwxr-x 3 mhr mhr 4096 Apr 16 08:28 ../
-rwxrwxr-x 1 mhr mhr 8936 Apr 19 03:57 a.out*
-rw-rw-r-- 1 mhr mhr  376 Apr 19 03:57 fgetc.c
-rw-rw-r-- 1 mhr mhr   11 Apr 19 03:54 test
mhr@ubuntu:~/work/linux/stdio$ 
mhr@ubuntu:~/work/linux/stdio$ gcc fgetc.c 
mhr@ubuntu:~/work/linux/stdio$ ./a.out test 
count = 11
mhr@ubuntu:~/work/linux/stdio$ 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章