C Primer Plus (第六版) 第十三章_编程练习答案

no1.c

// 修改程序清单13.1中的程序,要求提示用户输入文件名,并读取用户输入信息,不使用命令行参数.
# include <stdio.h>
# include <stdlib.h>

int main(void)
{
	int ch ;
	FILE * fp ;
	char st[100];
	unsigned long count = 0 ;

	printf("Please enter filename:");
	scanf("%s" , st);

	if ((fp = fopen(st , "r")) == NULL)
	{
		printf("Can't open %s\n" , st);
		exit(EXIT_FAILURE);
	}

	while ((ch = getc(fp)) != EOF)
	{
		putc(ch , stdout);
		count++ ;
	}
	fclose(fp);
	printf("File %s has %lu characters\n" , st, count);

	return 0 ;
} 

no2.c

//编写一个文件拷贝程序,该程序通过命令行获取原始文件名和拷贝文件名.尽量使用标准I/O和二进制模式
# include <stdio.h>
# include <stdlib.h>

int main(int argc , char * argv[])
{
	FILE * in , * out ;
	char ch ;
	size_t byt ;

	if (argc != 3)
	{
		fprintf(stderr , "错误的参数.\n");
		exit(EXIT_FAILURE);
	}

	if ((in = fopen(argv[1] , "rb")) == NULL)
	{
		fprintf(stderr , "打不开文件%s.\n" , argv[1]);
		exit(EXIT_FAILURE);
	}

	if ((out = fopen(argv[2] , "wb")) == NULL)
	{
		fprintf(stderr , "打不开文件%s.\n" , argv[2]);
		exit(EXIT_FAILURE);
	}

	while ((byt = fread(&ch , sizeof(ch) , 1 , in)) && !feof(in))
		fwrite(&ch , sizeof(ch) ,1 , out);

	if (fclose(in) || fclose(out))
	{
		fprintf(stderr , "退出失败.\n");
		exit(EXIT_FAILURE);
	}

	return 0 ;
}

no3.c

// 编写一个文件拷贝程序,提示用户输入文件名,并以该文件名作为原始文件名和输出文件名,
// 该程序要使用ctype.h中的toupper()函数,在写入到输出
// 文件是把所有文本转换成大写.使用标准I/O和文本模式.
# include <stdio.h>
# include <stdlib.h>
# include <ctype.h>

int main(void)
{
	char file[100];
	char ch ;
	FILE * fp ;

	puts("Please enter file name :");
	scanf("%s" , file);

	if ((fp = fopen(file , "r+")) == NULL)
	{
		printf("Can't open the %s\n" , file);
		exit(EXIT_FAILURE);
	}

	while ((ch = fgetc(fp)) != EOF)
	{
		if (islower(ch))
		{
			//当指定了“r+”、“w+”或“a+”访问类型时,
			//将同时启用读写(文件被称为打开进行“更新”)。
			//但是,当您从读取切换到写入时,输入操作必须遇到
			//一个EOF标记。如果没有eof,则必须使用对文件定位函数的中间调用。
			//以上就是我费尽九牛二虎之力查到的,如果没有重新定位,将无法写入
			//我试过了很多方法
			fseek(fp , - 1 , SEEK_CUR); //回退一个字符
			putc(toupper(ch) , fp);
			fseek(fp , 0 , SEEK_CUR);   //定位到当前字符位置
		}
	} 
	
	if (fclose(fp) != 0)
		printf("Error in closing files.\n");

	return 0 ;
}

no4.c

//编写一个程序,按顺序在屏幕上显示命令行中列出的所有文件.使用argc控制循环

# include <stdio.h>
# include <stdlib.h>

int main(int argc , char * argv[])
{
	FILE * fp ;
	char ch ;

	while (--argc > 0)
	{
		if (!(fp = fopen(*++argv , "r")))
		{
			fprintf(stderr , "打开%s文件失败.\n" , *argv);
			continue ;
		}
		
		while ((ch = getc(fp)) != EOF)	
			putc(ch ,stdout);

		if (fclose(fp))
		{
			fprintf(stderr , "退出%s文件失败.\n" , *argv);
			exit(EXIT_FAILURE);
		}
	}

	return 0 ;
}

no5.c

// 修改程序清单13.5中的程序,用命令行界面代替交互式界面.
# include <stdio.h>
# include <stdlib.h>
# include <string.h>

# define BUFSIZE 4096

void append(FILE * source , FILE * dest);
char * s_gets(char * st , int n);

int main(int argc , char * argv[])
{
	FILE * fa , * fs ;
	int files = 0 ;
	int ch ;

	if (argc < 3)
	{
		fprintf(stderr , "参数错误.\n");
		exit(EXIT_FAILURE);
	}

	if ((fa = fopen(argv[1] , "a+")) == NULL)
	{
		fprintf(stderr , "Can't open %s\n" , argv[1]);
		exit(EXIT_FAILURE);
	}

	if (setvbuf(fa , NULL , _IOFBF , BUFSIZE) != 0)
	{
		fputs("Can't create output buffer\n" , stderr);
		exit(EXIT_FAILURE);
	}

	for(int i = 2 ; i < argc ; i++)
	{
		if (strcmp(argv[1] , argv[i]) == 0)
			fputs("Can't append file to itself\n" , stderr);
		else if ((fs = fopen(argv[i] , "r")) == NULL)
			fprintf(stderr , "Can't open %s\n" , argv[i]);
		else
		{
			if (setvbuf(fs , NULL , _IOFBF , BUFSIZE) != 0)
			{
				fputs("Can't create input buffer\n" , stderr)
  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值