2024-2025-1 20241421《计算机基础与程序设计》第十四周学习总结
作业信息
这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计
这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十四周作业
这个作业的目标 自学《C语言程序设计》第13-14章
作业正文 https://www.cnblogs.com/118qa/p/18639231
教材学习内容总结
C 语言文件知识
文件的基本概念
在 C 语言中,文件是存储在外部介质(如磁盘)上的数据集合,可分为文本文件(以 ASCII 码形式存储字符,便于阅读)和二进制文件(按数据在内存中的存储形式原样存储,更紧凑高效)。
文件指针
通过FILE类型的指针来操作文件,如FILE *fp,这个指针指向文件相关的信息结构体,用于跟踪文件的读写位置等状态。
文件的打开与关闭
打开文件:使用fopen()函数,其语法为FILE *fp = fopen("文件名", "文件操作模式");,文件操作模式常见的有"r"(只读打开文本文件)、"w"(只写打开文本文件,若文件存在则覆盖,不存在则创建)、"a"(追加模式打开文本文件,在文件末尾添加内容),还有对应的二进制文件操作模式如"rb"、"wb"、"ab"等。若打开失败,fopen()返回NULL。
关闭文件:用fclose(fp)函数关闭已打开的文件指针fp指向的文件,及时关闭能避免资源泄露、保证数据完整写入磁盘等,关闭成功返回0,失败返回EOF(-1)。
文件的读写操作
字符读写:
fgetc()函数从指定文件中读取一个字符,返回读取到的字符(以int类型返回,读到文件末尾返回EOF),例如int ch = fgetc(fp);。
fputc()函数用于向文件写入一个字符,如fputc('A', fp);将字符A写入文件指针fp指向的文件中,成功写入返回写入的字符,失败返回EOF。
字符串读写:
fgets()函数从文件中读取一行字符串到指定的字符数组中,例如char str[100]; fgets(str, 100, fp);,读到文件末尾或遇到错误返回NULL。
fputs()函数把字符串写入文件,如fputs("Hello", fp);将字符串Hello写入文件,成功返回非负整数,失败返回EOF。
格式化读写:
fscanf()函数按照指定格式从文件中读取数据,类似scanf()但针对文件,例如fscanf(fp, "%d", &num);从文件读取一个整数到变量num中。
fprintf()函数按格式向文件写入数据,像fprintf(fp, "%d", num);把变量num的值按指定格式写入文件。
块读写:
fread()和fwrite()函数用于读写二进制数据块,fread(buffer, size, count, fp)从文件fp中读取count个大小为size字节的数据块到buffer中,fwrite(buffer, size, count, fp)则相反,把buffer中的数据写入文件,它们返回实际读写的块数。
C 语言常见错误
语法错误
遗漏分号:C 语言语句一般以分号结尾,若遗漏可能导致编译报错,例如int a = 5(缺少分号)。
括号不匹配:在函数调用、控制结构(如if、for、while等语句)中括号数量不对,像if(a > 0 { // 少了右括号会引发编译错误。
关键字拼写错误:误写了 C 语言的关键字,比如写成whlie(正确是while)等,编译器无法识别而报错。
逻辑错误
循环条件错误:例如for(int i = 0; i < 10; i++)本想循环 10 次,但写成for(int i = 0; i <= 10; i++)就会多循环一次,导致结果不符合预期。
变量未初始化:定义了变量但没有给初始值就直接使用,其值是不确定的,可能造成计算等结果出错,像int num; printf("%d", num);,输出的是随机值。
逻辑判断失误:在if、else if、else等条件判断语句中,逻辑关系设置错误,使得程序执行的分支不对,影响最终结果。
运行时错误
数组越界:访问数组元素时超出了数组定义的范围,例如int arr[5]; arr[10] = 5;,这可能破坏内存中其他数据,导致程序异常崩溃。
除数为零:在做除法运算时,分母为 0,像int result = 5 / 0;会引发运行时错误,程序终止运行。
文件操作相关错误:如试图打开不存在的文件却以读模式打开(fopen("nonexist.txt", "r");返回NULL,后续若没判断直接读写就会出错),或者在文件已经关闭的情况下还继续读写操作等。
类型错误
数据类型不匹配的赋值:例如把浮点数赋值给整型变量,int num = 3.14;,会截断小数部分,可能不符合期望的数值处理要求。
不同类型间不恰当的运算:像对指针和整数直接做加法等不符合语法规则的运算操作,编译器会报错提示类型不兼容。
C 语言程序调试
打印调试信息
在代码关键位置使用printf()函数输出变量的值、程序执行到的阶段提示等内容,例如在循环内部打印循环变量的值,通过查看这些输出结果来分析程序流程和数据变化是否正常,辅助查找错误原因。
使用调试工具(如 GDB)
设置断点:可以指定程序运行到某一行代码时暂停,例如在gcc编译程序时加上-g选项开启调试信息,然后用gdb调试器加载可执行文件,使用break命令设置断点(如break main在主函数入口设置断点)。
单步执行:通过next(执行下一行语句,不进入函数内部)、step(执行下一行语句,遇到函数会进入函数内部)等命令逐行执行代码,观察变量的实时状态。
查看变量值:使用print命令查看特定变量的值,如print num查看变量num的值,便于分析程序运行时数据是否正确。
分析调用栈:当程序涉及多层函数调用时,用backtrace命令查看函数调用栈,了解函数的调用顺序以及当前所处的位置,有助于排查深层次的逻辑错误。
代码审查
人工仔细检查代码的语法、逻辑结构、变量使用等方面,查看是否存在容易引发错误的写法,比如复杂的嵌套if语句逻辑是否清晰、函数参数传递是否合理等,也可以请他人帮忙审查从不同视角发现问题。
异常处理
在 C 语言中,可以使用errno全局变量结合perror()函数来处理一些运行时的异常情况,例如文件打开失败时,通过判断fopen()返回的NULL,再调用perror("文件打开失败");,可以输出详细的错误原因提示,帮助定位问题所在。同时对于可能出现的其他异常情况,如内存分配失败等,也可通过类似方式进行一定的错误处理和提示,提高程序的健壮性。
教材学习中遇到的问题
问题:如何将文件与指针联系?
AI:1. 理解文件指针的类型
首先要知道在 C 语言里,文件指针的类型是 FILE 。例如像这样声明一个文件指针变量:FILE *fp; ,这个 fp 就是后续用于指向具体文件相关信息结构体的指针,通过它可以对文件实施各种操作。
2. 文件的打开操作
使用 fopen() 函数来打开文件并让文件指针指向该文件,其语法格式如下:
FILE *fp = fopen("文件名", "文件操作模式");
这里的 “文件名” 就是要操作的实际文件的名称(包含路径等完整信息,若只写文件名则默认在当前目录下查找),“文件操作模式” 常见的有以下几种:
文本文件操作模式:
"r":只读方式打开文本文件,若文件不存在则打开失败,返回 NULL 指针。常用于读取已有文件中的内容。
"w":只写方式打开文本文件,如果文件存在就将其原有内容覆盖,如果不存在则创建新文件,适合用于向文件写入全新内容。
"a":以追加方式打开文本文件,会在文件末尾添加新内容,若文件不存在同样会创建新文件,常用于在已有文件基础上续写内容。
二进制文件操作模式:
"rb":只读打开二进制文件,和 "r" 类似但针对二进制文件类型,遵循二进制文件的读写规则。
"wb":只写打开二进制文件,功能类似 "w" ,用于二进制文件的创建或覆盖式写入。
"ab":追加模式打开二进制文件,如同 "a" 模式用于在二进制文件末尾续写内容。
例如,打开一个名为 "test.txt" 的文本文件用于读取内容,可以这样写:
FILE *fp = fopen("test.txt", "r");
如果 fopen() 函数执行成功,fp 就指向了该文件对应的内部结构体(包含文件位置、缓冲区等相关信息),后续就可以通过这个指针进行读写等操作;若打开失败(比如文件不存在或者权限不足等原因),fp 会返回 NULL ,所以通常需要进行判断来避免后续对空指针进行操作导致错误,像这样:
c
if(fp == NULL)
{
perror("文件打开失败");
return -1;
}
3. 文件的读写操作与指针
一旦文件通过 fopen() 成功打开,文件指针就用于定位文件读写的位置,并执行相应读写操作,以下是常见的读写函数与指针的关联:
字符读写:
fgetc(fp):从文件指针 fp 指向的文件中读取一个字符(以 int 类型返回,读到文件末尾返回 EOF,即 -1 )。每次调用该函数,文件指针会自动向后移动一个字符位置,准备读取下一个字符,例如:
c
int ch;
while((ch = fgetc(fp))!= EOF)
{
putchar(ch); // 将读取到的字符输出显示,也可做其他处理
}
fputc(c, fp):把字符 c 写入到文件指针 fp 指向的文件中,成功写入返回写入的字符,失败返回 EOF。每写入一个字符,文件内部的指针也会相应移动到下一个可写入位置,比如:
c
char ch = 'A';
fputc(ch, fp);
字符串读写:
fgets(str, n, fp):从文件指针 fp 指向的文件中读取一行字符串到字符数组 str 中,最多读取 n - 1 个字符(会自动添加 '\0' 作为字符串结束标志),读到文件末尾或者遇到错误返回 NULL 。读取后文件指针移动到该行末尾的下一个字符位置,示例如下:
c
char str[100];
if(fgets(str, 100, fp)!= NULL)
{
printf("%s", str); // 输出读取到的字符串,也可做其他处理
}
fputs(s, fp):把字符串 s (以 '\0' 结尾)写入文件指针 fp 指向的文件中,成功返回非负整数,失败返回 EOF ,写入后文件指针移动到相应的新位置,像:
c
char s[] = "Hello, world!";
fputs(s, fp);
格式化读写:
fscanf(fp, "%d", &num):按照指定格式从文件指针 fp 指向的文件中读取数据,和 scanf() 类似但针对文件,读取后文件指针根据实际读取的数据量移动到相应位置,这里从文件读取一个整数到变量 num 中,例如:
c
int num;
fscanf(fp, "%d", &num);
fprintf(fp, "%d", num):按格式将变量 num 的值写入文件指针 fp 指向的文件中,类似 printf() 针对文件的操作,写入后文件指针也会做出相应调整,如:
c
int num = 10;
fprintf(fp, "%d", num);
块读写:
fread(buffer, size, count, fp) 和 fwrite(buffer, size, count, fp) 这两个函数用于二进制数据块的读写,fread() 从文件 fp 中读取 count 个大小为 size 字节的数据块到 buffer 中,fwrite() 则相反,把 buffer 中的数据写入文件。操作完成后,文件指针会根据读写的数据量移动相应字节数的位置,例如:
c
int buffer[10];
// 写入数据块
fwrite(buffer, sizeof(int), 10, fp);
// 读取数据块(假设之前已写入相应数据)
fread(buffer, sizeof(int), 10, fp);
4. 文件的关闭操作
当对文件的读写等操作完成后,需要使用 fclose(fp) 函数关闭文件指针 fp 指向的文件,释放相关资源并确保文件数据正确保存到磁盘等存储介质上。关闭成功返回 0 ,失败返回 EOF(-1),示例如下:
c
fclose(fp);
总之,在 C 语言中文件指针就像是一个纽带,从文件的打开、读写到关闭整个过程,都依靠它来关联并操作对应的文件,让程序能够有效地与外部文件进行数据交互。
基于AI的学习