实验 3:我们与计算机的交流方式

一、实验目标

  1. 熟练运用标准输入输出函数(scanfprintf)处理不同类型数据的输入与输出。
  2. 掌握简单文本文件的读写操作,能编写完整的文件操作程序。

二、核心知识回顾

(一)标准输入函数:scanf

  • 语法格式:scanf(格式控制字符串, 变量地址列表)
  • 核心要求:第2至n个参数必须是变量地址(加&)或指向变量地址的指针。
  • 常用格式控制符
    • 整型:%d(有符号十进制)、%u(无符号十进制)、%o(八进制)、%x/X(十六进制)。
    • 实型:%f(小数/指数形式)、%e/E(指数形式)、%g/G(自动选最短格式)。
    • 字符/字符串:%c(单个字符)、%s(字符串)。
  • 附加格式符:l(长整型/双精度)、h(短整型)、域宽(指定输入宽度)、*(读入不赋值)。
  • 关键注意事项
    • 输入数据需与格式控制字符串完全匹配,否则停止读取。
    • 读取整型数据时,遇空格、回车、非小数点符号或字母即结束。
    • %c会读取空格、回车等空白字符,需注意输入顺序。

(二)标准输出函数:printf

  • 语法格式:printf(格式控制字符串, 输出数据列表)
  • 常用格式控制符:与scanf基本一致,%f默认输出6位小数。
  • 附加格式符:l(长整型)、m(最小输出宽度)、.n(指定小数位数/字符串截取长度)、-(左对齐)。
  • 功能:可输出变量、常量或表达式的值,支持多类型数据同时输出。

(三)文本文件操作

  • 核心流程:包含头文件(#include <stdio.h>)→ 定义文件指针(FILE *fp)→ 打开文件(fopen)→ 读写操作(fscanf/fprintf)→ 关闭文件(fclose)。
  • 关键函数
    • 打开文件:fp = fopen("文件名", "打开方式"),常用方式有"w"(只写,创建新文件)、"r"(只读,需文件已存在)。
    • 写文件:fprintf(文件指针, 格式字符串, 输出表列),用法与printf类似,多文件指针参数。
    • 读文件:fscanf(文件指针, 格式字符串, 地址表列),用法与scanf类似,需指定文件指针。
    • 关闭文件:fclose(文件指针),避免数据丢失和资源占用。

三、实验内容与示例代码

(一)实验1:字符型数据的双重显示

  • 实验要求:定义两个字符型变量,分别用字符方式和整数方式显示,验证字符与ASCII码的对应关系。
  • 示例代码
#include <stdio.h>
int main() {
    char c1, c2;
    c1 = 'a';  // 可替换为97、197等数值
    c2 = 'b';  // 可替换为98、198等数值
    printf("%c %c\n", c1, c2);  // 字符方式显示
    printf("%d %d\n", c1, c2);  // 整数方式显示(ASCII码)
    return 0;
}
  • 预期结果:字符初始化时输出对应字符及ASCII码(如a b97 98),超出ASCII范围的数值输出特殊字符及对应整数。

(二)实验2:多类型数据的输入与输出

  • 实验要求:通过scanf输入指定数据(a=3b=7x=8.5y=71.82c1=Ac2=a),并用printf显示。
  • 示例代码(两种格式控制方式)
  1. 基础格式
#include <stdio.h>
int main() {
    int a, b;
    float x, y;
    char c1, c2;
    scanf("%d%d", &a, &b);
    scanf("%f%f", &x, &y);
    scanf("%c%c", &c1, &c2);
    printf("a=%d, b=%d\n", a, b);
    printf("x=%f, y=%f\n", x, y);
    printf("c1=%c, c2=%c\n", c1, c2);
    return 0;
}
  1. 带提示字符格式
#include <stdio.h>
int main() {
    int a, b;
    float x, y;
    char c1, c2;
    scanf("a=%d, b=%d,", &a, &b);
    scanf("x=%f, y=%f,", &x, &y);
    scanf("%c,%c", &c1, &c2);
    printf("a=%d, b=%d\n", a, b);
    printf("x=%f, y=%f\n", x, y);
    printf("c1=%c, c2=%c\n", c1, c2);
    return 0;
}

(三)实验3:文本文件写入

  • 实验要求:创建文本文件,写入整型、实型、字符型数据。
  • 示例代码
#include <stdio.h>
int main() {
    int a;
    float b;
    char c;
    FILE *fp;
    scanf("%d,%f,%c", &a, &b, &c);  // 输入格式:123,4.5,n
    fp = fopen("test1.txt", "w");    // 以只写方式创建文件
    fprintf(fp, "%d %f %c\n", a, b, c);  // 写入文件
    fclose(fp);  // 关闭文件
    return 0;
}

(四)实验4:文本文件读取与显示

  • 实验要求:读取已创建的文本文件数据,显示到屏幕上。
  • 示例代码
#include <stdio.h>
int main() {
    int a1;
    float b1;
    char c1;
    FILE *fp;
    fp = fopen("test1.txt", "r");  // 以只读方式打开文件
    fscanf(fp, "%d,%f,%c", &a1, &b1, &c1);  // 按写入格式读取
    printf("a1=%d, b1=%f, c1=%c\n", a1, b1, c1);  // 显示数据
    fclose(fp);  // 关闭文件
    return 0;
}

四、重难点总结

(一)重点

  1. scanfprintf的格式控制符匹配与参数使用。
  2. 文本文件“打开-读写-关闭”的完整流程。
  3. 不同类型数据的输入输出格式规范。

(二)难点

  1. scanf输入时的格式匹配问题,尤其是空白字符的处理。
  2. 文件操作函数的正确调用,包括文件路径、打开方式的选择。

五、思考题

  1. 为何scanf需要使用变量地址,而printf不需要?
  2. 文件操作结束后,为何必须用fclose关闭文件?