2024-2025-1 20241415 《计算机基础与程序设计》第十二周学习总结
2024-2025-1 20241415《计算机基础与程序设计》第十二周学习总结
作业信息
这个作业属于哪个课程 | 2024-2025-1-计算机基础与程序设计 |
---|---|
这个作业要求在哪里 | 2024-2025-1计算机基础与程序设计第十二周作业 |
这个作业的目标 | 复习巩固前面所学的内容 |
作业正文 | https://www.cnblogs.com/zhaoshaoning/p/18607774 |
教材学习内容总结
- 文件的基本概念
- 在C语言中,文件是存储在外部介质(如磁盘)上的数据的集合。它可以是程序文件(包含源代码等),也可以是数据文件(用于存储程序运行时需要的数据)。
- 文件通常被视为字节序列,C语言可以对这些字节进行读取、写入和其他操作。每个文件都有一个文件名,通过文件名来识别和访问文件。例如,在Windows系统中,文件名可能是“example.txt”,在Linux系统中也类似,但文件名的命名规则可能因操作系统而略有差异。
- 文件指针
- 文件指针是C语言中操作文件的关键。它是一个指向
FILE
类型结构体的指针。FILE
结构体包含了文件的各种信息,如文件的当前位置、缓冲区信息等。 - 要使用文件,首先需要声明一个文件指针。例如:
FILE *fp;
,这里fp
就是一个文件指针,它可以用来指向一个打开的文件。 - 在C标准库中,
<stdio.h>
头文件包含了文件操作相关的函数和FILE
结构体的定义。所以在进行文件操作之前,需要包含这个头文件。
- 文件指针是C语言中操作文件的关键。它是一个指向
- 文件的打开与关闭
- 打开文件:使用
fopen()
函数来打开文件。它的基本形式是FILE *fopen(const char *filename, const char *mode);
。filename
是要打开的文件名,可以包含路径。例如,在Windows系统中,如果文件在当前目录下,文件名可以是“data.txt”;如果在其他目录下,可能是“C:\Users\user\Documents\data.txt”(注意反斜杠的转义)。在Linux系统中,路径格式可能是“/home/user/data.txt”。mode
是打开文件的模式,常见的模式有:"r"
:以只读方式打开文件。如果文件不存在,fopen()
函数会返回NULL
。"w"
:以只写方式打开文件。如果文件存在,会清空文件内容;如果文件不存在,则创建新文件。"a"
:以追加方式打开文件。如果文件存在,写入的数据会追加到文件末尾;如果文件不存在,则创建新文件。"r +"
:以读/写方式打开文件,文件必须存在。"w +"
:以读/写方式打开文件。如果文件存在,会清空文件内容;如果文件不存在,则创建新文件。"a +"
:以读/写方式打开文件,写入的数据会追加到文件末尾。如果文件不存在,则创建新文件。
- 关闭文件:使用
fclose()
函数来关闭文件。例如:fclose(fp);
,其中fp
是已经打开的文件指针。关闭文件是一个良好的编程习惯,它可以确保数据被正确地写入文件,并且释放与文件相关的资源。如果不关闭文件,可能会导致数据丢失或资源泄漏。
- 打开文件:使用
- 文件的读写操作
- 字符读写:
fgetc()
函数用于从文件中读取一个字符。它的基本形式是int fgetc(FILE *stream);
,其中stream
是文件指针。例如:
上述代码打开一个名为“test.txt”的文件,然后使用FILE *fp; char ch; fp = fopen("test.txt", "r"); if(fp!= NULL) { ch = fgetc(fp); while(ch!= EOF) { putchar(ch); ch = fgetc(fp); } fclose(fp); }
fgetc()
函数逐个字符地读取文件内容,并通过putchar()
函数将字符输出到控制台,直到遇到文件结束标志EOF
(End - Of - File)。fputc()
函数用于向文件中写入一个字符。它的基本形式是int fputc(int c, FILE *stream);
,其中c
是要写入的字符,stream
是文件指针。例如:
这段代码打开一个名为“output.txt”的文件,然后使用FILE *fp; char ch = 'A'; fp = fopen("output.txt", "w"); if(fp!= NULL) { fputc(ch, fp); fclose(fp); }
fputc()
函数将字符A
写入文件,最后关闭文件。
- 字符串读写:
fgets()
函数用于从文件中读取一个字符串。它的基本形式是char *fgets(char *s, int n, FILE *stream);
,其中s
是存储读取字符串的字符数组,n
是最多读取的字符数(包括字符串结束符'\0'
),stream
是文件指针。例如:
此代码从“test.txt”文件中读取最多99个字符(加上FILE *fp; char str[100]; fp = fopen("test.txt", "r"); if(fp!= NULL) { fgets(str, 100, fp); printf("%s", str); fclose(fp); }
'\0'
共100个字符)存储到str
数组中,并将其输出到控制台。fputs()
函数用于向文件中写入一个字符串。它的基本形式是int fputs(const char *s, FILE *stream);
,其中s
是要写入的字符串,stream
是文件指针。例如:
代码将字符串“Hello, World!”写入名为“output.txt”的文件中。FILE *fp; char str[] = "Hello, World!"; fp = fopen("output.txt", "w"); if(fp!= NULL) { fputs(str, fp); fclose(fp); }
- 格式化读写:
fscanf()
函数用于从文件中按照指定格式读取数据。它的基本形式是int fscanf(FILE *stream, const char *format,...);
,与scanf()
函数类似,但是它从文件而不是标准输入读取数据。例如:
这段代码从“data.txt”文件中读取一个整数存储到FILE *fp; int num; fp = fopen("data.txt", "r"); if(fp!= NULL) { fscanf(fp, "%d", &num); printf("The number read from file is %d\n", num); fclose(fp); }
num
变量中,并将其输出。fprintf()
函数用于向文件中按照指定格式写入数据。它的基本形式是int fprintf(FILE *stream, const char *format,...);
,与printf()
函数类似,但是它向文件而不是标准输出写入数据。例如:
此代码将包含整数FILE *fp; int num = 10; fp = fopen("output.txt", "w"); if(fp!= NULL) { fprintf(fp, "The number is %d", num); fclose(fp); }
num
值的字符串写入名为“output.txt”的文件中。
- 字符读写:
- 文件的定位操作
ftell()
函数用于获取文件指针的当前位置。它的基本形式是long ftell(FILE *stream);
,返回值是从文件开头到文件指针当前位置的字节数。例如:FILE *fp; long position; fp = fopen("test.txt", "r"); if(fp!= NULL) { // 读取一些数据或者进行其他操作 position = ftell(fp); printf("The current position of the file pointer is %ld\n", position); fclose(fp); }
fseek()
函数用于设置文件指针的位置。它的基本形式是int fseek(FILE *stream, long offset, int whence);
。offset
是偏移量,whence
是起始位置,whence
可以有以下几种取值:SEEK_SET
:文件开头,偏移量是从文件开头开始计算。SEEK_CUR
:文件当前位置,偏移量是从文件指针当前位置开始计算。SEEK_END
:文件末尾,偏移量是从文件末尾开始计算(偏移量为负数时表示向文件开头方向移动)。例如:FILE *fp; fp = fopen("test.txt", "r"); if(fp!= NULL) { fseek(fp, 5, SEEK_SET); // 从文件开头偏移5个字节后的位置开始读取或操作 fclose(fp); }
rewind()
函数用于将文件指针重新定位到文件开头。它的基本形式是void rewind(FILE *stream);
。例如:FILE *fp; fp = fopen("test.txt", "r"); if(fp!= NULL) { // 进行一些操作 rewind(fp); // 重新从文件开头开始操作 fclose(fp); }
教材学习中的问题和解决过程(先问 AI)
- 问题1:在打开文件时应该怎样选择打开文件的方式,如只读、只写等?
- 问题1解决方案:
-
只读方式(
"r"
)的选择情况- 当你的程序只需要从文件中获取信息,而不会对文件内容进行修改时,应该选择只读方式打开文件。例如,读取配置文件、读取文本内容用于显示或分析等场景。
- 假设你有一个程序,它需要读取一个包含用户设置选项(如字体大小、颜色主题等)的配置文件
config.ini
。这个程序只需要获取这些设置信息来初始化界面,而不会改变配置文件的内容。此时就可以使用"r"
模式打开文件,代码如下:
FILE *fp; fp = fopen("config.ini", "r"); if(fp == NULL) { // 处理文件打开失败的情况,比如打印错误信息并退出程序 perror("Error opening file"); return 1; } // 在这里使用fgetc、fgets、fscanf等函数读取文件内容 fclose(fp);
- 这种方式可以确保文件内容的完整性,因为程序没有权限修改文件内容。如果文件不存在,使用
"r"
模式打开时,fopen
函数会返回NULL
,所以在实际应用中需要检查文件是否成功打开。
-
只写方式(
"w"
)的选择情况- 当你需要创建一个新文件或者清空一个已存在文件的内容,并向其中写入数据时,选择只写方式。例如,生成一个新的日志文件来记录程序运行信息,或者创建一个新的数据文件来存储用户输入的数据等场景。
- 比如,你要创建一个日志文件
program.log
来记录程序每次运行的时间和状态信息。每次程序运行时,都希望清空旧的日志内容并开始新的记录,就可以使用"w"
模式打开文件,代码如下:
FILE *fp; fp = fopen("program.log", "w"); if(fp == NULL) { perror("Error opening file"); return 1; } // 使用fprintf等函数写入日志信息,如记录程序启动时间 time_t now; time(&now); fprintf(fp, "Program started at %s", ctime(&now)); fclose(fp);
- 注意,如果文件已经存在,使用
"w"
模式打开会清空文件中原有的内容。如果文件不存在,fopen
函数会创建一个新的文件。
-
追加方式(
"a"
)的选择情况- 当你希望在文件末尾添加新的数据,而不影响文件中已有的内容时,使用追加方式。例如,记录程序的运行历史记录,每次程序运行添加新的一行记录;或者收集用户的操作日志,不断在日志文件末尾添加新的操作记录等场景。
- 假设你有一个简单的计数器程序,每次运行时,它要将当前的运行次数追加到一个文件
count.txt
中。代码如下:
FILE *fp; int count = 1; // 假设这是第1次运行,实际可以从文件读取之前的计数并加1 fp = fopen("count.txt", "a"); if(fp == NULL) { perror("Error opening file"); return 1; } fprintf(fp, "Run %d\n", count); fclose(fp);
- 使用
"a"
模式打开文件时,如果文件不存在,fopen
函数会创建一个新文件;如果文件存在,则将写入的数据追加到文件的末尾。
-
读写方式(
"r +"
、"w +"
、"a +"
)的选择情况"r +"
模式:- 当你需要读取和修改一个已经存在的文件内容时可以选择
"r +"
模式。例如,你有一个文本文件,里面存储了一些学生的成绩信息,你需要读取这些成绩进行分析,并且可能会修改某些成绩的值。 - 但是要注意,使用
"r +"
模式打开文件时,文件必须已经存在,否则fopen
函数会返回NULL
。
- 当你需要读取和修改一个已经存在的文件内容时可以选择
"w +"
模式:- 这种模式类似于
"w"
模式和"r"
模式的结合。它会创建一个新文件或者清空已有文件内容,同时允许你对文件进行读写操作。例如,你要创建一个临时的数据文件,先写入一些初始数据,然后再读取这些数据进行处理。不过这种模式在实际应用中要谨慎使用,因为很容易不小心清空文件内容。
- 这种模式类似于
"a +"
模式:- 它允许你在文件末尾进行追加写入操作,同时也能读取文件内容。不过读取操作可能会受到文件指针位置的影响。例如,在追加一些数据后,如果你想读取文件开头的内容,可能需要先将文件指针移动到文件开头(使用
rewind
或fseek
函数)。这种模式适用于需要在记录新数据的同时,也可能需要查看之前记录的数据的情况,比如在更新日志文件的同时,也可以查看之前的日志记录。
- 它允许你在文件末尾进行追加写入操作,同时也能读取文件内容。不过读取操作可能会受到文件指针位置的影响。例如,在追加一些数据后,如果你想读取文件开头的内容,可能需要先将文件指针移动到文件开头(使用
基于AI的学习