|
|
|
|
|
|
![]() Chapter 22Answers to Selected Exercises2. [was #2]
(a) 4. [was #4]
(a)
6. [was #6]
8. [was #8] No. The difference is that
char c, s[2];
scanf(" %c", &c); /* stores a nonblank character into c */
scanf("%1s", s); /* stores a nonblank character into s[0]
and a null character into s[1] */
10. [was #10] Revise the program's
while ((ch = getc(source_fp)) != EOF)
if (putc(ch, dest_fp) == EOF) {
fprintf(stderr, "Error during writing; copy terminated\n");
exit(EXIT_FAILURE);
}
14. [was #18] (a)
char *fget_string(char *s, int n, FILE *stream)
{
int ch, len = 0;
while (len < n - 1) {
if ((ch = getc(stream)) == EOF) {
if (len == 0 || ferror(stream))
return NULL;
break;
}
s[len++] = ch;
if (ch == '\n')
break;
}
s[len] = '\0';
return s;
}
(b)
int fput_string(const char *s, FILE *stream)
{
while (*s != '\0') {
if (putc(*s, stream) == EOF)
return EOF;
s++;
}
return 0;
}
15. [was #22]
(a) Answers to Selected Programming Projects2. [was #12]
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
int ch;
if (argc != 2) {
fprintf(stderr, "usage: toupper file\n");
exit(EXIT_FAILURE);
}
if ((fp = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "Can't open %s\n", argv[1]);
exit(EXIT_FAILURE);
}
while ((ch = getc(fp)) != EOF)
putchar(toupper(ch));
fclose(fp);
return 0;
}
4. [was #14] (a)
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
int count = 0;
if (argc != 2) {
fprintf(stderr, "usage: cntchar file\n");
exit(EXIT_FAILURE);
}
if ((fp = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "Can't open %s\n", argv[1]);
exit(EXIT_FAILURE);
}
while (getc(fp) != EOF)
count++;
printf("There are %d characters in %s\n", count, argv[1]);
fclose(fp);
return 0;
}
(b)
#include <ctype.h>
#include <stdbool.h> /* C99 only */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
int ch, count = 0;
bool in_word;
if (argc != 2) {
fprintf(stderr, "usage: cntword file\n");
exit(EXIT_FAILURE);
}
if ((fp = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "Can't open %s\n", argv[1]);
exit(EXIT_FAILURE);
}
in_word = false;
while ((ch = getc(fp)) != EOF)
if (isspace(ch))
in_word = false;
else if (!in_word) {
in_word = true;
count++;
}
printf("There are %d words in %s\n", count, argv[1]);
fclose(fp);
return 0;
}
(c)
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
int ch, count = 0;
if (argc != 2) {
fprintf(stderr, "usage: cntline file\n");
exit(EXIT_FAILURE);
}
if ((fp = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "Can't open %s\n", argv[1]);
exit(EXIT_FAILURE);
}
while((ch = getc(fp)) != EOF)
if (ch == '\n')
count++;
printf("There are %d lines in %s\n", count, argv[1]);
fclose(fp);
return 0;
}
6. [was #16; modified]
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
int i, n, offset;
unsigned char buffer[10];
if (argc != 2) {
fprintf(stderr, "usage: viewfile file\n");
exit(EXIT_FAILURE);
}
if ((fp = fopen(argv[1], "rb")) == NULL) {
fprintf(stderr, "Can't open %s\n", argv[1]);
exit(EXIT_FAILURE);
}
printf("Offset Bytes Characters\n");
printf("------ ----------------------------- ----------\n");
for (offset = 0;; offset += 10) {
n = fread(buffer, 1, 10, fp);
if (n == 0)
break;
printf("%6d ", offset);
for (i = 0; i < n; i++)
printf("%.2X ", buffer[i]);
for (; i < 10; i++)
printf(" ");
printf(" ");
for (i = 0; i < n; i++) {
if (!isprint(buffer[i]))
buffer[i] = '.';
printf("%c", buffer[i]);
}
printf("\n");
}
fclose(fp);
return 0;
}
9. [was #20]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NAME_LEN 25
struct part {
int number;
char name[NAME_LEN + 1];
int on_hand;
};
int main(int argc, char *argv[])
{
FILE *in_fp1, *in_fp2, *out_fp;
int num_read1, num_read2;
struct part part1, part2;
if (argc != 4) {
fprintf(stderr, "usage: merge infile1 infile2 outfile\n");
exit(EXIT_FAILURE);
}
if ((in_fp1 = fopen(argv[1], "rb")) == NULL) {
fprintf(stderr, "Can't open %s\n", argv[1]);
exit(EXIT_FAILURE);
}
if ((in_fp2 = fopen(argv[2], "rb")) == NULL) {
fprintf(stderr, "Can't open %s\n", argv[2]);
exit(EXIT_FAILURE);
}
if ((out_fp = fopen(argv[3], "wb")) == NULL) {
fprintf(stderr, "Can't open %s\n", argv[3]);
exit(EXIT_FAILURE);
}
num_read1 = fread(&part1, sizeof(struct part), 1, in_fp1);
num_read2 = fread(&part2, sizeof(struct part), 1, in_fp2);
while (num_read1 == 1 && num_read2 == 1)
/* successfully read records from both files */
if (part1.number < part2.number) {
fwrite(&part1, sizeof(struct part), 1, out_fp);
num_read1 = fread(&part1, sizeof(struct part), 1, in_fp1);
} else if (part1.number > part2.number) {
fwrite(&part2, sizeof(struct part), 1, out_fp);
num_read2 = fread(&part2, sizeof(struct part), 1, in_fp2);
} else {
/* part numbers are equal */
if (strcmp(part1.name, part2.name) != 0)
fprintf(stderr,
"Names don't match for part %d; using the name %s\n",
part1.number, part1.name);
part1.on_hand += part2.on_hand;
fwrite(&part1, sizeof(struct part), 1, out_fp);
num_read1 = fread(&part1, sizeof(struct part), 1, in_fp1);
num_read2 = fread(&part2, sizeof(struct part), 1, in_fp2);
}
/* copy rest of file1 to output file */
while (num_read1 == 1) {
fwrite(&part1, sizeof(struct part), 1, out_fp);
num_read1 = fread(&part1, sizeof(struct part), 1, in_fp1);
}
/* copy rest of file2 to output file */
while (num_read2 == 1) {
fwrite(&part2, sizeof(struct part), 1, out_fp);
num_read2 = fread(&part2, sizeof(struct part), 1, in_fp2);
}
fclose(in_fp1);
fclose(in_fp2);
fclose(out_fp);
return 0;
}
Copyright © 2008, 1996 W. W. Norton & Company, Inc. All rights reserved. |