#2023-2024-1 20231408《计算机基础与程序设计》第十四周学习总结
作业信息
这个作业属于哪个课程 | <2023-2024-1-计算机基础与程序设计> |
---|---|
这个作业要求在哪里 | <2023-2024-1计算机基础与程序设计第十四周作业> |
这个作业的目标 | <《C语言程序设计》第13章> |
作业正文 | https://www.cnblogs.com/jfxyh061028/p/17937008 |
教材学习内容总结
- 文件的两种类型:文本文件和二进制文件及两种文件里变量占用内存的大小及特点(前者一个字节对应一个字符,后者一个字节不一定对应一个字符)的不同。
- 高级文件操作函数(缓冲型文件系统中的文件操作)包括
- 文件的打开和关闭:函数原型分别为
FILE *fopen(const char *filename,const char *mode);
和int fclose(FILE *fp);
。
fopen的作用:用于打开文件,并返回一个指向文件的指针。参数filename是要打开的文件名,参数mode指定文件的打开模式,例如"r"表示只读,"w"表示写入(若文件不存在则创建,若存在则清空),"a"表示追加等。
fclose的作用:用于关闭已打开的文件。关闭文件后,释放文件指针所占用的资源。
- 文件的读写:有许多方式的读写方式,读写文件中的字符、读写文件中的字符串、按格式读写文件、按数据块读写文件、文件的随机读写等等。对应也有很多函数实现相应功能,如fgetc(),fgets(),fscanf(),fread(),fwrite()等。
注意:经常用
fp=fopen("filename","打开方式");
if(fp==NULL)
{
printf("Failure to open filename!"\n);
exit(0);
}
这样的语句检查文件打开成功与否。
3. 文件的位置定位
有fseek()和ftell()。
fseek:移动文件指针
- 函数原型:int fseek(FILE *stream, long offset, int whence);
- 作用:用于移动文件指针到指定位置。参数offset表示偏移量,whence表示相对位置,可以是SEEK_SET(从文件开头开始计算偏移)、SEEK_CUR(从当前位置开始计算偏移)、SEEK_END(从文件末尾开始计算偏移)。
ftell:获取文件指针位置 - 函数原型:long ftell(FILE *stream);
- 作用:用于获取文件指针的当前位置,返回当前位置的偏移字节数。
教材学习中的问题和解决过程
- 问题1:文件读写操作失败可能是什么情况?
- 解决:
-
文件不存在或无法打开:当指定的文件不存在或无法打开时,会导致文件读写操作失败。
-
文件权限问题:如果文件没有正确的读写权限,尝试对其进行读写操作会失败。
-
磁盘空间不足:如果磁盘空间不足,写入文件时可能会失败。
-
文件指针位置错误:在文件读写过程中,文件指针的位置不正确可能导致读写错误。
-
读写操作超出文件大小:尝试在文件末尾写入数据或者读取超出文件大小的数据会导致错误。
-
操作系统或硬件故障:操作系统或硬件故障可能导致文件读写操作失败。
- 问题2:文件指针有点模糊。
- 解决:文件指针是一个指向文件的指针,用于标识当前文件操作的位置。在C语言中,当我们打开一个文件时,系统会自动维护一个文件指针,用于跟踪文件的当前位置。文件指针可以通过文件操作函数进行移动,以实现对文件的读取和写入操作。
举例说明:
FILE *fp; // 定义文件指针
fp = fopen("example.txt", "r"); // 打开文件
fseek(fp, 0, SEEK_SET); // 将文件指针移动到文件开头
代码调试中的问题和解决过程
- 我写的代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
float a,area=0,step=0.0001;
int i;
scanf("%f",&a);
for(i=0; i<a; i+=step)
{
area+=step*sin(i);
}
printf("%.2f\n",area);
return 0;
}
运行时除了输入0能输出0外,输入其他值均没有输出。
最后发现问题在于我在for后面的括号内让i每次循环后加0.0001,这是一个浮点数,而i却被我定义为整型,这会使得相加结果出错。把i改为整型后就可以正常运行了。
2. 我写的代码(oj平台上的CP1250)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int a,b,c,sum,number,abc,acb,bac,bca,cab,cba;
printf("Input a sum:");
scanf("%d",&sum);
for(a=1;a<=9;a++)
{
for(b=1;b<=9;b++)
{
for(c=1;c<=9;c++)
{
acb=a*100+c*10+b;
bac=b*100+a*10+c;
bca=b*100+c*10+a;
cab=c*100+a*10+b;
cba=c*100+b*10+a;
number=acb+bac+bca+cab+cba;
}
}
}
abc=a*100+b*10+c;
if(sum==number)
{
printf("The number is %d\n",abc);
}
else
{
printf("The sum you calculated is wrong!\n");
}
return 0;
}
运行时没有按照预期输出,比如我输入1999,本来应该输出The number is 443.而它输出的是The sum you calculated is wrong!但是我的条件里明明写的是如果sum==number,输出443,为什么会输出计算错误呢?后来我发现是因为犯了两个错误:
- 一个是应该把if语句放到循环里,这样才能把每一次循环得到的和number与sum比较,判断是否相等,否则像我这样,输出的只会是把最后一次循环得到的结果与sum比较后的结果。
- 另一个是我应该增加一条退出语句,以保证在找到正确的值后及时退出循环,不再继续比较以免输出很多错误提示。
改正后,正确的代码应该是
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int a,b,c,sum,number,abc,acb,bac,bca,cab,cba;
printf("Input a sum:");
scanf("%d",&sum);
for(a=1; a<=9; a++)
{
for(b=1; b<=9; b++)
{
for(c=1; c<=9; c++)
{
acb=a*100+c*10+b;
bac=b*100+a*10+c;
bca=b*100+c*10+a;
cab=c*100+a*10+b;
cba=c*100+b*10+a;
number=acb+bac+bca+cab+cba;
abc=a*100+b*10+c;
if(sum==number)
{
printf("The number is %d\n",abc);
return 0;
}
}
}
}
printf("The sum you calculated is wrong!\n");
return 0;
}
基于AI的学习
学习结果:
在缓冲型文件系统中,高级文件操作函数通常包括以下几种:
- fopen:打开文件
- fclose:关闭文件
- fread:读取文件
- fwrite:写入文件
- fseek:移动文件指针
- ftell:获取文件指针位置
- feof:检查文件结束标记
- fflush:刷新文件缓冲区
fopen:打开文件
- 函数原型:FILE *fopen(const char *filename, const char *mode);
- 作用:用于打开文件,并返回一个指向文件的指针。参数filename是要打开的文件名,参数mode指定文件的打开模式,例如"r"表示只读,"w"表示写入(若文件不存在则创建,若存在则清空),"a"表示追加等。
fclose:关闭文件
- 函数原型:int fclose(FILE *stream);
- 作用:用于关闭已打开的文件。关闭文件后,释放文件指针所占用的资源。
fread:读取文件
- 函数原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
- 作用:从打开的文件中读取数据,并将其存储到ptr指向的内存中。参数size表示每个数据项的字节数,nmemb表示要读取的数据项数量。
fwrite:写入文件
- 函数原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
- 作用:将ptr指向的数据写入到打开的文件中。参数size表示每个数据项的字节数,nmemb表示要写入的数据项数量。
fseek:移动文件指针
- 函数原型:int fseek(FILE *stream, long offset, int whence);
- 作用:用于移动文件指针到指定位置。参数offset表示偏移量,whence表示相对位置,可以是SEEK_SET(从文件开头开始计算偏移)、SEEK_CUR(从当前位置开始计算偏移)、SEEK_END(从文件末尾开始计算偏移)。
ftell:获取文件指针位置
- 函数原型:long ftell(FILE *stream);
- 作用:用于获取文件指针的当前位置,返回当前位置的偏移字节数。
feof:检查文件结束标记
- 函数原型:int feof(FILE *stream);
- 作用:用于检查文件结束标记。如果已经读取到文件末尾,则返回非零值;否则返回0。
fflush:刷新文件缓冲区
- 函数原型:int fflush(FILE *stream);
- 作用:用于将缓冲区的数据立即写入文件,而不是等到缓冲区满或文件关闭时才写入。
这些高级文件操作函数在缓冲型文件系统中提供了对文件的灵活操作,包括打开、关闭、读取、写入、定位文件指针等功能,为程序员提供了丰富的文件处理能力。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | 优秀 |
第一周 | 2/3 | 20/20 | 合格 | |
第二周 | 20/20 | 1/4 | 15/35 | 终于理解了一些概念,能看懂一些话了 |
第三周 | 20/40 | 1/5 | 20/55 | |
第四周 | 50 /90 | 2/7 | 20/75 | |
第五周 | 80/170 | 1/8 | 30/105 | 会编写一些简单程序了 |
第六周 | 30/200 | 2/10 | 30/135 | 编程水平提升了 |
第七周 | 30/230 | 1/11 | 25/160 | 编程得更熟,也知道了计算机方面更多粗浅的知识。 |
第八周 | 60/290 | 2/13 | 30/190 | 对于高级语言的一致性有了认识。 |
第九周 | 100/390 | 1/14 | 30/230 | |
第十周 | 100/490 | 2/16 | 30/260 | |
第十一周 | 150/640 | 2/18 | 30/290 | |
第十二周 | 200/840 | 1/19 | 30/320 | |
第十三周 | 200/1040 | 1/20 | 20/340 | |
第十四周 | 150/1190 | 1/21 | 20/360 |