14-第13章复习题答案
A.13 第13章复习题答案
1.根据文件定义,应包含 #include <stdio.h> 。应该把 fp 声明为文件指针: FILE * fp; 。要给 fopen() 函数提供一种模式: fopen("gelatin","w") ,或者 "a" 模式。 fputs() 函数的参数顺序应该反过来。输出字符串应该有一个换行符,提高可读性。 fclose() 函数需要一个文件指针,而不是一个文件名: fclose(fp); 。下面是修改后的版本:
#include <stdio.h>
int main(void)
{
FILE * fp;
int k;
fp = fopen("gelatin", "w");
for (k = 0; k < 30; k++)
fputs("Nanette eats gelatin.\n", fp);
fclose(fp);
return 0;
}
2.如果可以打开的话,会打开与命令行第1个参数名相同名称的文件,并在屏幕上显示文件中的每个数字字符。
3.a. ch = getc(fp1);
b. fprintf(fp2,"%c"\n",ch);
c. putc(ch,fp2);
d. fclose(fp1); / 关闭 terky 文件 /
注意
fp1用于输入操作,因为它识别以读模式打开的文件。与此类似,fp2以写模式打开文件,所以常用于输出操作。
4.下面是一种方案:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv [])
{
FILE * fp;
double n;
double sum = 0.0;
int ct = 0;
if (argc == 1)
fp = stdin;
else if (argc == 2)
{
if ((fp = fopen(argv[1], "r")) == NULL)
{
fprintf(stderr, "Can't open %s\n", argv[1]);
exit(EXIT_FAILURE);
}
}
else
{
fprintf(stderr, "Usage: %s [filename]\n", argv[0]);
exit(EXIT_FAILURE);
}
while (fscanf(fp, "%lf", &n) == 1)
{
sum += n;
++ct;
}
if (ct > 0)
printf("Average of %d values = %f\n", ct, sum / ct);
else
printf("No valid data.\n");
return 0;
}
5.下面是一种方案:
#include <stdio.h>
#include <stdlib.h>
#define BUF 256
int has_ch(char ch, const char * line);
int main(int argc, char * argv [])
{
FILE * fp;
char ch;
char line[BUF];
if (argc != 3)
{
printf("Usage: %s character filename\n", argv[0]);
exit(EXIT_FAILURE);
}
ch = argv[1][0];
if ((fp = fopen(argv[2], "r")) == NULL)
{
printf("Can't open %s\n", argv[2]);
exit(EXIT_FAILURE);
}
while (fgets(line, BUF, fp) != NULL)
{
if (has_ch(ch, line))
fputs(line, stdout);
}
fclose(fp);
return 0;
}
int has_ch(char ch, const char * line)
{
while (*line)
if (ch == *line++)
return(1);
return 0;
}
fgets() 和 fputs() 函数要一起使用,因为 fgets() 会把按下 Enter 键的 \n 留在字符串中, fputs() 与 puts() 不一样,不会添加一个换行符。
6.二进制文件与文本文件的区别是,这两种文件格式对系统的依赖性不同。二进制流和文本流的区别包括是在读写流时程序执行的转换(二进制流不转换,而文本流可能要转换换行符和其他字符)。
7.a.用 fprintf() 存储 8238201 时,将其视为7个字符,保存在7字节中。用 fwrite() 存储时,使用该数的二进制表示,将其存储为一个4字节的整数。
b.没有区别。两个函数都将其存储为一个单字节的二进制码。
8.第1条语句是第2条语句的速记表示。第 3 条语句把消息写到标准错误上。通常,标准错误被定向到与标准输出相同的位置。但是标准错误不受标准输出重定向的影响。
9.可以在以 "r+" 模式打开的文件中读写,所以该模式最合适。 "a+" 只允许在文件的末尾添加内容。 "w+" 模式提供一个空文件,丢弃文件原来的内容。