当前位置:嗨网首页>书籍在线阅读

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+" 模式提供一个空文件,丢弃文件原来的内容。