C Primer Plus 第六版 第十三章 编程练习

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+
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值