嵌入式Linux標準IO,拷貝檔案fgetc()/fputc(),fread()/fwrite()
阿新 • • 發佈:2018-11-04
文章目錄
- 1,按字元輸入fgetc(),getc(),getchar()
- 2,按字元輸出fputc(),putc(),putchar()
- 3,通過fgetc()/fputc()拷貝檔案
- 執行結果
- 通過fread()/fwrite()拷貝檔案
- 執行結果
1,按字元輸入fgetc(),getc(),getchar()
下列函式用來輸入一個字元:
#include <stdio.h>
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar(void);
- 成功時返回讀取的字元; 若到檔案末尾或出錯時返回EOF
- 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);
- 成功時返回寫入的字元; 出錯時返回EOF
- 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;
}
}
執行結果