关于c:浙大版C语言程序设计第四版何钦铭颜晖-第12章-文件-课后习题答案

4次阅读

共计 7671 个字符,预计需要花费 20 分钟才能阅读完成。

你也能够上程序咖 (https://meta.chengxuka.com),关上大学幕题板块,岂但有答案,解说,还能够在线答题。

一、选择题

1. 以下语句的输入后果是()。

printf("%d,%d,%d", NULL, '\0', EOF);

A.0,0,1

B.0,0,-1

C. NULL, ,EOF

D. 1,0, EOF

答:B

解析:

NULL 等于 0
‘\0’ 也是等于 0
EOF 等于 -1

2. 缓冲文件系统的文件缓冲区位于()。

A. 磁盘缓冲区中

B. 磁盘文件中

C. 内存数据区中

D. 程序文件中

答:C

解析:

文件缓冲区是用以临时寄存读写期间的文件数据而在内存区预留的肯定空间

3. 定义 FILE *fp; 则文件指针 fp 指向的是()。

A. 文件在磁盘上的读写地位

B. 文件在缓冲区上的读写地位

C. 整个磁盘文件

D. 文件类型构造

答:D

解析:

语句 FILE *fp;,定义了一个 FILE 构造指针,FILE 是 C 语言为了具体实现对文件的操作而定义的一个蕴含文件操作相干信息的构造类型。

4. 若以“a+”形式关上一个已存在的文件,则以下叙述正确的是()。

A. 文件关上时,原有文件内容不被删除,地位指针移到文件开端,可执行增加和读操作

B. 文件关上时,原有文件内容不被删除,地位指针移到文件结尾,可执行重写和读操作

C. 文件关上时,原有文件内容被删除,只可执行写操作

D. 以上各种说法都不正确

答:A

解析:

“a+” 的关上模式,关上文本文件进行读 / 写 / 追加。

5. 以下可作为函数 fopen() 中第一个参数的正确格局是()。

A. C: user\text. txt

B. c: \user\text. txt

C. “e:\user\ text. txt”

D. "c:\\user\\text.txt"

答:D

解析:

函数 fopen 的第一个参数是指要关上的文件名的字符串,所以选项 A、B 是谬误的。文件门路分隔符 \ 必须应用转义字符,即 \\,所以选项 C 也是谬误的。选项 D 是正确的。

二、填空题

1. 文件的三大特色是()、数据长度不定和数据按程序存取。

答:数据短暂保留

解析:

文件是保留在外在存储器上的一组数据的有序汇合。文件的特点是数据短暂保留,数据长度不定,数据按程序存取。

2. 依据数据存储的编码模式,C 语言中解决的数据文件通常为()文件和()文件两种。

答:

文本文件

二进制世间

解析:

在 C 语言中,依照存储的编码模式,数据文件能够分为文本文件和二进制文件两种。文本文件是以字符 ASCII 码值进行存储与编码的文件,其文件的内容就是字符。二进制文件是存储二进制数据的文件。

3. 判断文件指针是否曾经到了文件尾部的函数是()。

答:feof()

解析:

feof(),用于判断 fp 指针是否曾经到文件开端,即读文件是否读到了文件完结的地位。其调用格局为:feof(fp); 该函数胜利返回 1 示意曾经到了文件完结地位,0 示意文件未完结。

4. 统计文本文件的字符数量。统计文本文件 “letter.txt” 中字符的个数。请填空。

#include <stdio.h>
int main()
{
    FILE *fp;
    int count = 0;
    fp = fopen("letter.txt", _________);
    while (!feof(fp))
    {
        _________;
        count++;
    }
    printf("count=%d\n", count);
    fclose(fp);
    return 0;
}

答:

“r”

fgetc(fp)

解析:

第一个空,关上文件的模式,因为只是读取,所以填 “r” 就能够。

第二个空,就是一一读取字符。

5. 以下程序段实现的性能是()。

    char infile[10], outfile[10];
    FILE *fpa, *fpb;
    gets(infile);
    gets(outfile);
    fpa = fopen(infile, "r");
    fpb = fopen(outfile, "w");
    while (!feof(fpa))
    {fputc(fgetc(fpa), fpb);
    }
    fclose(fpa);
    fclose(fpb);

答:将文件名为键盘输入的 infile 示意的文件内容复制到文件名为键盘输入的 outfile 变量示意的文件中

解析:

这里只读模式关上了 infile 文件,只写模式关上了 outfile,而后循环读取 infile 文件中的每个字符,写入到 outfile 文件中。

三、程序设计题

题目 1:统计文本文件中各类字符个数:别离统计一个文本文件中字母,数字及其他字符的个数。试编写相应程序。

答案代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{// 习题 (12.3.1)
    /*
    统计文本文件中各类字符个数:别离统计一个文本文件中字母,数字及其他字符的个数。*/

    char ch;
    char *path = "data1.txt";
    FILE *fp = fopen(path, "r");
    if (!fp)
    {printf("file open error\n");
        exit(0);
    }

    int letter = 0, digit = 0, other = 0;

    while ((ch = fgetc(fp)) != EOF) // EOF 示意达到开端
    {if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))

            letter++;
        else if (ch >= '0' && ch <= '9')
            digit++;
        else
            other++;
    }
    printf("字母:%d, 数字:%d, 其余:%d\n", letter, digit, other);

    fclose(fp);
    return 0;
}

运行后果:

所读文件内容如下:

题目 2:将实数写入文件:从键盘输入若干实数 (以非凡数值 - 1 完结),别离写到一个文本文件中。试编写相应程序。

答案代码:

#include <stdio.h>
#include "stdlib.h"
int main()
{// 习题 (12.3.2)
    /*
    将实数写入文件:从键盘输入若干实数 (以非凡数值 - 1 完结),别离写到一个文本文件中。*/

    FILE *fp;
    float num = 0;

    fp = fopen("data2.txt", "w+");
    if (!fp)
    {printf("file open error\n");
        exit(0);
    }
    while (scanf("%f", &num), num != -1)
    {fprintf(fp, "%f\n", num);
    }
    fclose(fp);

    return 0;
}

运行后果:

写入指标文件:

题目 3:比拟两个文本文件是否相等:比拟两个文本文件的内容是否雷同,并输入两个文件中第一次呈现不同字符内容的行号及列值。试编写相应程序。

答案代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{// 习题 (12.3.3)
    /*
    比拟两个文本文件是否相等:比拟两个文本文件的内容是否雷同,并输入两个文件中第一次呈现不同字符内容的行号及列值。*/

    FILE *fp1, *fp2;
    int array1 = 1, row1 = 1, array2 = 1, row2 = 1;
    char ch1, ch2;
    // data3_1 与 data3_2 都是与以后程序在同一目录下的文件
    fp1 = fopen("data3_1.txt", "r");
    fp2 = fopen("data3_2.txt", "r");
    if (!fp1 || !fp2)
    {printf("file open error\n");
        exit(0);
    }

    while (!feof(fp1) || !feof(fp2))
    {ch1 = fgetc(fp1);
        ch2 = fgetc(fp2);
        if (ch1 == '\n')
        {
            row1++;
            array1 = 1;
        }
        if (ch2 == '\n')
        {
            row2++;
            array2 = 1;
        }
        if (ch1 == EOF || ch2 == EOF)
            break;
        if (ch1 != ch2)
        {printf("data3_1\t 行号:%d 列号:%d\n", row1, array1);
            printf("data3_2\t 行号:%d 列号:%d\n", row2, array2);
            break;
        }
        else
        {
            array1++;
            array2++;
            printf("读到字符:%c\n", ch1);
        }
    }
    if (ch1 == EOF && ch2 != EOF)
        printf("data3_2 文件曾经达到开端");
    if (ch2 == EOF && ch1 != EOF)
        printf("data3_1 文件曾经达到开端");
    if (ch1 == EOF && ch2 == EOF)
        printf("两个文件完全相同!");
    fclose(fp1);
    fclose(fp2);

    return 0;
}

两个文件的内容雷同:

运行后果:

两个文件的内容不同:

运行后果:

题目 4:将文件中的数据求和并写入文本文件尾:文件 Int _Data.dat 中寄存了若干整数,将文件中所有数据相加,并把累加和写入该文件的最初。试编写相应程序。

答案代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{// 习题 (12.3.4)
    /*
    将文件中的数据求和并写入文本文件尾:文件 Int _Data. dat 中寄存了若干整数,将文件中所有数据相加,并把累加和写入该文件的最初。*/
    FILE *fp;
    int n, sum = 0;
    fp = fopen("Int _Data.dat", "rb+");
    if (!fp)
    {printf("file open error\n");
        exit(0);
    }
    // 读取
    while (fscanf(fp, "%d", &n) != EOF)
        sum += n;
    printf("sum = %d\n", sum);
    fprintf(fp, "\n%d", sum);
    fclose(fp);
    return 0;
}

Int _Data.dat 文件中的内容:

运行后果:

写入计算结果后,Int _Data.dat 文件中的内容:

题目 5:输入含 for 的行:将文本文件 test.txt 中所有蕴含字符串“for”的行输入。试编写相应程序。

答案代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 80

void Findfor(char *ch);
int main()
{// 习题 (12.3.5)
    /*
    输入含 for 的行:将文本文件 test.txt 中所有蕴含字符串“for”的行输入。*/

    FILE *fp;
    char ch[N];
    fp = fopen("test.txt", "r");
    while (!feof(fp))
    {fgets(ch, N, fp);
        Findfor(ch);
    }
    fclose(fp);
    return 0;
}

void Findfor(char *ch)
{
    int i = 0;
    for (i = 0; i < strlen(ch); i++)
    {if (ch[i] == 'f' && ch[i + 1] == 'o' && ch[i + 2] == 'r')
            printf("This row have for:%s\n", ch);
    }
}

test.txt 文件内容如下:

运行后果:

题目 6:删除文件中的正文:将 C 语言源程序(hello.c)文件中的所有正文去掉后存入另一个文件(new_ hello.c)。试编写相应程序。

答案代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{// 习题 (12.3.6)
    /*
    删除文件中的正文:将 C 语言源程序(hello.c)文件中的所有正文去掉后存入另一个文件(new_ hello.c)。*/

    FILE *fp1, *fp2;
    char ch;
    char comment[2];
    /* 关上读出数据的文件 */
    if ((fp1 = fopen("hello.c", "r")) == NULL)
    {printf("File open error!\n");
        exit(0);
    }
    /* 关上写入数据的文件 */
    if ((fp2 = fopen("new_hello.c", "w")) == NULL)
    {printf("File open error!\n");
        exit(0);
    }
    /* 对文件 1 中的字符进行解决 */
    while (!feof(fp1))
    {ch = fgetc(fp1);
        if (ch == EOF)
            continue;
        if (ch == '/')
        {ch = fgetc(fp1);
            // 单行正文,遇到换行符完结,完结后需输入换行符
            if (ch == '/')
            {while (ch != '\n' && ch != EOF)
                {ch = fgetc(fp1);
                }
                fputc('\n', fp2);
            }
            /* 跨行正文,遇到结束符完结,每次读入两个字符进行比拟,若不是则退回一个字符,持续比拟 */
            else if (ch == '*')
            {fgets(comment, 3, fp1);
                while (strstr(comment, "*/") == NULL)
                {fseek(fp1, -1L, SEEK_CUR);
                    fgets(comment, 3, fp1);
                }
            }
            // 不是正文符,只是单纯的 '/' 符号,则退回两个字符,读写 '/'
            else
            {fseek(fp1, -2L, SEEK_CUR);
                ch = fgetc(fp1);
                fputc(ch, fp2);
            }
        }
        else
        {fputc(ch, fp2);
        }
    }
    // 敞开文件
    if (fclose(fp1))
    {printf("Can not close the file! \n");
        exit(0);
    }
    // 敞开文件
    if (fclose(fp2))
    {printf("Can not close the file! \n");
        exit(0);
    }
    printf("解决完结 \n");

    return 0;
}

运行后果:

hello.c 文件和 new_ hello.c 文件比照:

题目 7:(选做)账户余额治理:创立一个随机文件,用来存储银行账户和余额信息,程序要求可能查问某个账户的余额,当客户产生交易额时(正示意存入,负示意取出)可能更新余额。账户信息包含账号、账号名和余额三个数据项。试编写相应程序。

文件局部内容如下:

AcctNo AcctName Balance
1 zhangsan 1 000. 00
2 lisi 1 300. 00
3 wangwu – 100. 00
……

答案代码:

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

long size;
struct account
{char no[10];
    char acctname[50];
    double balance;
};

FILE *openfile(char *openmode);
double userbalance(FILE *fp, char *name);
void pay(FILE *fp, char *name, double count);
int main()
{// 习题 (12.3.7)
    /*
    选做)账户余额治理:创立一个随机文件,用来存储银行账户和余额信息,程序要求可能查问某个账户的余额,当客户产生交易额时(正示意存入,负示意取出)可能更新余额。账户信息包含账号、账号名和余额三个数据项。*/

    FILE *fp;
    int choice;
    char name[50];
    double balance;
    double count;

    while (1)
    {printf("请输出抉择类型 \n");
        printf("1. 查账户余额 \n");
        printf("2. 账户交易 \n");
        printf("退出按其她 \n");
        scanf("%d", &choice);
        switch (choice)
        {
        case 1:
        {printf("输出名字:");
            scanf("%s", name);
            fp = openfile("r+");
            balance = userbalance(fp, name);
            printf("%s, %.2lf\n", name, balance);

            break;
        }
        case 2:
        {printf("输出名字:");
            scanf("%s", name);
            fp = openfile("r+");
            printf("输出交易金额:");
            scanf("%lf", &count);
            pay(fp, name, count);
            break;
        }
        default:
            exit(0);
            break;
        }
    }
    return 0;
}
// 关上文件
FILE *openfile(char *openmode)
{
    FILE *fp;
    if ((fp = fopen("accout.dat", openmode)) == NULL)
    {printf("File open error!\n");
        exit(0);
    }
    return fp;
}

// 用户余额
double userbalance(FILE *fp, char *name)
{
    struct account user;
    double balance;
    fseek(fp, 0L, SEEK_SET);
    while (!feof(fp))
    {fscanf(fp, "%s %s %lf", user.no, user.acctname, &user.balance);
        if (strcmp(user.acctname, name) == 0)
        {
            balance = user.balance;
            break;
        }
    }
    // fclose(fp);
    return balance;
}

// 交易
void pay(FILE *fp, char *name, double count)
{
    FILE *fpout;
    struct account user;
    double balance;
    balance = userbalance(fp, name);
    balance = balance + count;
    fseek(fp, 0L, SEEK_SET);
    fpout = fopen("temp.dat", "w");
    int no = 0;
    int res = 1;
    while (1)
    {res = feof(fp);
        if (res != 0)
        {break;}

        fscanf(fp, "%s %s %lf\n", user.no, user.acctname, &user.balance); // 读入
        // printf("%s %s %lf\n", user.no, user.acctname, user.balance);
        if (strcmp(user.acctname, name) == 0)
        {
            user.balance = balance;
            // printf("if---%s %s %lf\n", user.no, user.acctname, user.balance);
            fprintf(fpout, "%s %s %.2lf\n", user.no, user.acctname, user.balance);
        }
        else
        {// printf("else---%s %s %lf\n", user.no, user.acctname, user.balance);
            fprintf(fpout, "%s %s %.2lf\n", user.no, user.acctname, user.balance);
        }
    }

    fclose(fpout);
    fclose(fp);
    unlink("accout.dat");
    rename("temp.dat", "accout.dat");
}

accout.dat 文件内容:

运行后果:

accout.dat 更改后:

正文完
 0