1.修改程序清单13.1中的程序,要求提示用户输入文件名,并读取用户输入的信息,不使用命令行参数。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 40
int main(void)
{
char filename[SIZE];
int ch;
FILE *fp;
unsigned long count=0;
puts("Enter the filename: ");
if(scanf("%s",filename)!=1)
{
puts("Filename intput error.");
exit(EXIT_FAILURE);
}
if((fp=fopen(filename,"r"))==NULL)
{
printf("Can't open file:%s.\n",filename);
exit(EXIT_FAILURE);
}
while((ch=getc(fp))!=EOF)
{
putchar(ch); // putc(ch,stdout);
count++;
}
putchar('\n');
fclose(fp);
printf("File %s has %lu characters.\n",filename,count);
return 0;
}
2.编写一个文件拷贝程序,该程序通过命令行获取原始文件名和拷贝文件名。尽量使用标准I/O 和二进制模式。
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char * argv[])
{
int ch;
FILE * fp1;
FILE * fp2;
if(argc!=3)
{
printf("%s:Usage filename.\n",argv[1]);
exit(EXIT_FAILURE);
}
if((fp1=fopen(argv[1],"rb"))==NULL)
{
printf("Couldn't open file:%s\n",argv[1]);
exit(EXIT_FAILURE);
}
if((fp2=fopen(argv[2],"wb"))==NULL)
{
printf("Couldn't open file:%s\n",argv[2]);
exit(EXIT_FAILURE);
}
printf("Originally file:%s\n",argv[1]);
while((ch=getc(fp1))!=EOF)
putc(ch,stdout);
putchar('\n');
fseek(fp1,0L,SEEK_SET); // 定位到文件开头
while((ch=getc(fp1))!=EOF) // 把第一个文件的内容复制到第二个文件
putc(ch,fp2);
fclose(fp1);
fclose(fp2);
if((fp2=fopen(argv[2],"rb"))==NULL)
{
printf("couldn't open file:%s\n",argv[2]);
exit(EXIT_FAILURE);
}
printf("Now,file:%s\n",argv[2]); // 显示第二个文件的内容
while((ch=getc(fp2))!=EOF)
putc(ch,stdout);
fclose(fp2);
return 0;
}
3.编写一个文件拷贝程序,提示用户输入文本文件名,并以该文件名作为原始文件名和输出文件名。该程序要使用ctype.h中的toupper()函数,在写入到输出文件时把所有文本转换成大写,使用标准I/O和文本模式。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
char filename[40];
char ch;
FILE * fp;
printf("Enter the filename:\n");
if(scanf("%s",filename)!=1)
{
printf("Filename input error.\n");
exit(EXIT_FAILURE);
}
if((fp=fopen(filename,"r+"))==NULL)
{
printf("Couldn't open file:%s\n",filename);
exit(EXIT_FAILURE);
}
getchar();
printf("Enter the characters:\n");
while((ch=getchar())!=EOF) 从标准I/0中写入,并转换为大写后,写入文件
{
ch=toupper(ch);
putc(ch,fp);
}
fseek(fp,0,SEEK_SET);
printf("Now,file %s:\n",filename);
while((ch=getc(fp))!=EOF) //显示文件内容
putc(ch,stdout);
fclose(fp);
return 0;
}
4.编写一个程序,按顺序在屏幕上显示命令行中列出的所有文件。使用argc控制循环。
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char * argv[])
{
char ch;
FILE * fp;
int i;
for(i=0;i<argc-1;i++) // 使用argc控制循环,依次显示各个文件的内容
{
if((fp=fopen(argv[i+1],"r"))==NULL)
{
printf("Couldn't open file:%s\n",argv[i+1]);
exit(EXIT_FAILURE);
}
while((ch=getc(fp))!=EOF)
putc(ch,stdout);
putchar('\n');
fclose(fp);
}
printf("Done.\n");
return 0;
}
5.修改程序清单13.5中的程序,用命令行界面代替交互式界面。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFSIZE 4096
void append(FILE * fs,FILE * fa);
int main(int argc, char * argv[])
{
char ch;
int i;
FILE * fs,* fa;
if(argc<3)
{
printf("Need at least 2 file.\n");
exit(EXIT_FAILURE);
}
if((fa=fopen(argv[1],"a+"))==NULL) // 以更新模式打开文件,在末尾添加
{
fprintf(stderr,"error in open file %s\n",argv[1]);
exit(EXIT_FAILURE);
}
if(setvbuf(fa,NULL,_IOFBF,BUFFSIZE)!=0) // 为写设置缓冲区
{
fprintf(stderr,"error in set buffer for input.\n");
exit(EXIT_FAILURE);
}
for(i=0;i<argc-2;i+