1. 程式人生 > >嵌入式Linux標準IO,拷貝檔案fgetc()/fputc(),fread()/fwrite()

嵌入式Linux標準IO,拷貝檔案fgetc()/fputc(),fread()/fwrite()

文章目錄

1,按字元輸入fgetc(),getc(),getchar()

下列函式用來輸入一個字元:
#include <stdio.h>
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar(void);

  1. 成功時返回讀取的字元; 若到檔案末尾或出錯時返回EOF
  2. getchar()等同於fgetc(stdin)

2,按字元輸出fputc(),putc(),putchar()

下列函式用來輸出一個字元:
#include <stdio.h>
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);

  1. 成功時返回寫入的字元; 出錯時返回EOF
  2. putchar©等同於fputc(c, stdout)

3,通過fgetc()/fputc()拷貝檔案

#include <stdio.h>
#include <errno.h>
#include <string.h>

int get_file_size(const char *file);
int my_write_file_char(const char *file,const char *mode,char ch);
int my_cp_file(const char *src_file,const char *dst_file,const char *mode);

int main(int argc, const char *argv[
]) { int ch; if(argc <3) { printf("usage:%s <src_file> <dst_file>\n",argv[0]); return -1; } printf("src_total %d bytes\n",get_file_size(argv[1])); ch = fgetc(stdin); my_write_file_char(argv[1],"w",ch); printf("src_total %d bytes\n",get_file_size(argv[1])); ch ='a'; while(ch <= 'z') { my_write_file_char(argv[1],"a+",ch); ch++; } printf("src_total %d bytes\n",get_file_size(argv[1])); printf("dst_total %d bytes\n",get_file_size(argv[2])); my_cp_file(argv[1],argv[2],"w"); printf("dst_total %d bytes\n",get_file_size(argv[2])); return 0; } int get_file_size(const char *file) { int count=0; FILE *fp; if((fp = fopen(file,"r")) == NULL) { perror("get_size_fopen"); //printf("fopen:%NULLs\n",strerror(errno));//errno-----<errno.h>,strerror()------<string.h> return -1; } while(fgetc(fp) != EOF) { count ++; } if(fclose(fp) == EOF) { perror("_get_size_fclose"); return EOF; } return count; } int my_write_file_char(const char *file,const char *mode,char ch) { FILE *fp; if((fp = fopen(file,mode)) == NULL) { perror("write_file_char_fopen"); //printf("fopen:%NULLs\n",strerror(errno));//errno-----<errno.h>,strerror()------<string.h> return -1; } fputc(ch,fp); if(fclose(fp) == EOF) { perror("fclose"); return EOF; } } int my_cp_file(const char *src_file,const char *dst_file,const char *mode) { char ch; FILE *src_fp,*dst_fp; if((src_fp = fopen(src_file,"r")) == NULL) { perror("src_fopen"); return -1; } if((dst_fp = fopen(dst_file,mode)) == NULL) { perror("dst_fopen"); return -1; } while((ch = fgetc(src_fp)) != EOF) { fputc(ch,dst_fp); } if(fclose(src_fp) == EOF) { perror("src_fclose"); return EOF; } if(fclose(dst_fp) == EOF) { perror("dst_fclose"); return EOF; } }

執行結果

在這裡插入圖片描述

通過fread()/fwrite()拷貝檔案

int my_cp_file(const char *src_file,const char *dst_file,const char *mode)
{
	const int N = 64;
	char buf[N];
	int n = 0;
	FILE *src_fp,*dst_fp;
	if((src_fp = fopen(src_file,"r")) == NULL)
	{
		perror("src_fopen");
		return -1;
	}
	if((dst_fp = fopen(dst_file,mode)) == NULL)
	{
		perror("dst_fopen");
		return -1;
	}
	//size_t fread(void *ptr,size_t size,size_t n,FILE *fp);
	//size為要讀寫的流的物件的大小(單位:位元組),如:int是4,char是1
	while((n = fread(buf,1,N,src_fp)) > 0)
	{
		fwrite(buf,1,n,dst_fp);//buf空間為N(64位元組),但原始檔中不一定有N個位元組資料,此處寫入實際讀出的位元組數
	}

	if(fclose(src_fp) == EOF)
	{
		perror("src_fclose");
		return EOF;
	}
	if(fclose(dst_fp) == EOF)
	{
		perror("dst_fclose");
		return EOF;
	}	
}

執行結果

在這裡插入圖片描述