在C primier plus 13.3章节中,介绍了一个简单压缩程序,代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN 40
int main(int argc,char *argv[])
{
FILE *in,*out;
int ch; //字符存储位置,为什么是int ch,而不是char ch?
char name[LEN]; //getc(stdin)相当于getchar(),函数在返回一个字符时,会将
int count=0;
//char或unsigned char类型转换为int型。
if(argc!=2) //因为char或unsigned char取值范围是-128~127或0~255,无法正常
{ //区分返回的字符与EOF(-1)。
fprintf(stderr,"Usage: %s filename\n",argv[0]);
exit(1);
}
if((in=fopen(argv[1],"r"))==NULL)
{
fprintf(stderr,"I couldn't open the file\"%s\"\n",argv[1]);
exit(2);
}
strcpy(name,"eddy");//源代码是strcpy(name,argv[1]);strcat(name,".red");
strcat(name,".txt");
if((out=fopen(name,"w"))==NULL)
{
fprintf(stderr,"Can't create output file.\n");
exit(3);
}
while((ch=getc(in))!=EOF)//核心程序
if(count++ % 3 ==0) //打印每三个字符中的第三个!
putc(ch,out); //注意,count++,是先用再加!!!!
if(fclose(in)!=0 || fclose(out)!=0)
fprintf(stderr,"Error in closing files.\n");
return 0;
}
如果按照书上源码实现,出现的文件有可能在系统上面显示不出文件。
在cmd中运行代码如下,
得到一个新文件:eddy.txt.red
此时文件有可能在系统中打不开来。
使用新代码: strcpy(name,"eddy");
strcat(name,".txt");
此时注意把源文件(即要复制的文件改为除了eddy外的任意名字,如果是重名,会导致输出结果为空白。)
我把源文件改为eddy1.txt。
cmd窗口运行命令行为:
此时文件就多了eddy.txt的标准文档文件!
总结,了解argc,argv的运行机制,就可以明白为什么会出现eddy.txt.red文件名的文档了。回看C primier plus 第十三章 13.2标准I/O。