目录😋
<第1关:文件操作1>
任务描述
本关任务:将键盘输入的字符,以#代表结束,存入文件file1.txt中,并把存入的信息显示输出。
相关知识
为了完成本关任务,你需要掌握:
- 文件读写操作:使用文件指针 FILE *fp
- 文件结束标记:使用循环,判断是否读写到文件末尾,如while((str=fgetc(fp))!=EOF)
- 文件打开操作
在 C 语言中,使用
fopen()
函数来打开一个文件,该函数返回一个FILE*
类型的指针(即文件指针fp
),其函数原型为FILE *fopen(const char *filename, const char *mode);
例如,以只读方式打开一个名为
test.txt
的文本文件,代码如下:
int main() { FILE *fp; fp = fopen("test.txt", "r"); if (fp == NULL) { perror("Error opening file"); return 1; } // 文件操作代码 fclose(fp); return 0; }
在上述例子中,
"r"
是打开文件的模式,表示只读。若文件打开失败,fopen()
函数会返回NULL
,perror()
函数用于打印错误信息,包含系统错误信息和自定义的错误提示(此处是Error opening file
)。此外,其他常见的打开模式还有:
"w"
:只写模式。若文件不存在,则创建一个新文件;若文件已经存在,则截断文件(清空文件内容)。"a"
:追加模式。若文件不存在,则创建一个新文件;若文件已经存在,则将写入的数据追加到文件末尾。"r +"
:可读可写模式,文件必须存在。"w +"
:可读可写模式。若文件不存在,则创建一个新文件;若文件已经存在,则截断文件。"a +"
:可读可写模式。若文件不存在,则创建一个新文件;若文件已经存在,则将写入的数据追加到文件末尾。
- 文件读取操作
当文件以可读模式(如
"r"
、"r +"
、"a +"
等)打开后,可使用fgetc()
、fgets()
等函数来读取文件内容。使用
fgetc()
函数读取单个字符:以下是逐个字符读取文件内容并打印到控制台的示例代码:
int main() { FILE *fp; int c; fp = fopen("test.txt", "r"); if (fp == NULL) { perror("Error opening file"); return 1; } while ((c = fgetc(fp))!= EOF) { putchar(c); } fclose(fp); return 0; }
在该示例中,
fgetc(fp)
从文件指针fp
所指向的文件中读取一个字符并返回。若读取到文件末尾,fgetc()
函数会返回EOF
(EOF
是定义在<stdio.h>
头文件中的常量,通常值为 -1),putchar(c)
函数用于将字符c
输出到控制台。使用
fgets()
函数读取一行字符:示例代码如下:
int main() { FILE *fp; char buffer[100]; fp = fopen("test.txt", "r"); if (fp == NULL) { perror("Error opening file"); return 1; } while (fgets(buffer, sizeof(buffer), fp)!= NULL) { printf("%s", buffer); } fclose(fp); return 0; }
这里,
fgets(buffer, sizeof(buffer), fp)
会从文件指针fp
所指向的文件中读取一行字符(最多读取sizeof(buffer)-1
个字符,因为fgets()
会自动在读取的字符串末尾添加'\0'
字符来表示字符串结束),并将其存储到buffer
数组中。若读取到文件末尾,fgets()
函数会返回NULL
。
- 文件写入操作
当文件以可写模式(如
"w"
、"w +"
、"a"
、"a +"
等)打开后,可使用fputc()
、fputs()
等函数来写入文件内容。使用
fputc()
函数写入单个字符:例如,以下代码将字符
'A'
写入一个名为output.txt
的文件中:
int main() { FILE *fp; fp = fopen("output.txt", "w"); if (fp == NULL) { perror("Error opening file"); return 1; } fputc('A', fp); fclose(fp); return 0; }
在此处,
fputc('A', fp)
将字符'A'
写入文件指针fp
所指向的文件中。使用
fputs()
函数写入一行字符:示例代码如下:
int main() { FILE *fp; char str[] = "Hello, World!"; fp = fopen("output.txt", "w"); if (fp == NULL) { perror("Error opening file"); return 1; } fputs(str, fp); fclose(fp); return 0; }
这里,
fputs(str, fp)
将字符串str
写入文件指针fp
所指向的文件中。与fgets()
不同的是,fputs()
不会自动在字符串末尾添加换行符,若需要换行,可以在字符串中手动添加'\n'
字符。
- 文件关闭操作
无论对文件进行了何种操作(读取、写入等),在使用完文件后,都应该使用
fclose()
函数关闭文件,其函数原型为int fclose(FILE *stream);
。例如:
FILE *fp; fp = fopen("test.txt", "r"); // 文件操作 fclose(fp);
关闭文件有几个重要原因:
- 首先,它可以释放文件相关的系统资源,例如文件描述符等。
- 其次,确保文件的缓冲数据被正确地写入磁盘等存储设备。若不关闭文件,可能会导致数据丢失或文件损坏等问题。
- 文件结束标记
在 C 语言中,当对文件进行读取操作时,需要有一种机制来确定是否已经读到了文件的最后位置,也就是文件末尾。标准输入输出库提供了一个特殊的常量
EOF
(End Of File,通常其值被定义为 -1)来作为文件结束的标记。像
fgetc()
函数,它从文件指针fp
所指向的文件中每次读取一个字符,并返回该字符对应的 ASCII 码值(如果读取成功的话)。当它读到文件末尾时,就不再能获取到正常的字符数据了,此时它会返回EOF
这个特殊的值,以此来告知程序已经到达文件的末尾了。
以下是一个使用
while((str=fgetc(fp))!=EOF)
循环来读取文件内容并进行处理的示例:
int main() { FILE *fp; int str; // 用于接收fgetc返回值,定义为int类型是因为EOF是一个特殊的整型值(通常为 -1) fp = fopen("test.txt", "r"); // 以只读方式打开名为test.txt的文件 if (fp == NULL) { perror("Error opening file"); return 1; } while ((str = fgetc(fp))!= EOF) { // 循环读取文件,直到读到文件末尾(即fgetc返回EOF) putchar(str); // 将读取到的字符输出显示,这里可以替换为其他对字符的处理逻辑,比如存储到数组等 } fclose(fp); return 0; }
在上述代码中:
- 首先通过
fopen()
函数打开一个名为test.txt
的文件,如果打开失败,会输出错误信息并结束程序。- 接着进入
while
循环,在循环条件(str = fgetc(fp))!= EOF
中,先执行str = fgetc(fp)
,这一步调用fgetc()
函数从文件中读取一个字符,并把返回值(字符对应的 ASCII 码值或者EOF
)赋给str
,然后判断str
是否等于EOF
。如果不等于EOF
,说明还没读到文件末尾,就会执行循环体里面的代码(这里是简单地用putchar(str)
将字符输出到控制台,实际中可以根据需求进行更复杂的处理,比如统计字符个数、进行字符替换等操作)。一旦fgetc()
返回了EOF
,循环就会结束,表示文件内容已经全部读取完毕。- 最后使用
fclose()
函数关闭文件,释放相关资源。
编程要求
根据提示,在右侧编辑器代码文件中的 Begin-End 区间内补充代码
测试说明
平台会对你编写的代码进行测试:
测试输入:
asdfghjkl#
预期输出:
asdfghjkl
开始你的任务吧,祝你成功!
通关代码
int main( ) { FILE *fp; char str; if((fp=fopen("/data/workspace/myshixun/shiyan11/file1.txt", //请在此添加代码 /******Begin********/ "w" /******End*********/))==NULL) { printf("file cannot be opened\n"); exit(1); } //请在此添加代码 /******Begin********/ while((str = getchar())!='#'){ fputc(str,fp); } /******End*********/ fclose(fp); if ((fp=fopen("/data/workspace/myshixun/shiyan11/file1.txt", //请在此添加代码 /******Begin********/ "r" /******End*********/))==NULL) { printf("file can not be opened\n"); exit(1); } //请在此添加代码 /******Begin********/ while((str = fgetc(fp)) != EOF){ printf("%c",str); } /******End*********/ fclose(fp); return 1; }
测试结果
<第2关:文件操作2>
任务描述
本关任务:编写一个小程序,实现从键盘上输入若干行文本(每行不超过80个字符),写入到文件file2.txt中,用-1作为字符串输入结束的标志,然后将文件的内容读出显示在屏幕上。
相关知识
为了完成本关任务,你需要掌握:(与第1关相同)
- 文件读写操作:使用文件指针 FILE *fp
- 输入结束的判断:由于这里输入的数据为字符串,需要使用字符串函数进行比较
编程要求
根据提示,在右侧编辑器代码文件中的 Begin-End 区间内补充代码。
测试说明
平台会对你编写的代码进行测试:
测试输入:
qwert
asdfgh
zx
-1
预期输出:
qwert
asdfgh
zx
开始你的任务吧,祝你成功!
通关代码
void WriteText(FILE *); void ReadText(FILE *); int main( ) { FILE *fp; if((fp=fopen("/data/workspace/myshixun/shiyan11/file2.txt","w"))==NULL) { printf("cannot open file"); exit(0); } WriteText(fp); fclose(fp); if((fp=fopen("/data/workspace/myshixun/shiyan11/file2.txt","r"))==NULL) { printf("cannot open file"); exit(0); } ReadText(fp); fclose(fp); } void WriteText(FILE *fw) { char str[81]; //请在此添加代码 /******Begin********/ while(1){ fgets(str,81,stdin); str[strcspn(str,"\n")]=0; if(strcmp(str,"-1")==0){ break; } fprintf(fw,"%s\n",str); /******End*********/ } } void ReadText(FILE *fr) { char str[81]; //请在此添加代码 /******Begin********/ while(fgets(str,81,fr)!= NULL){ printf("%s",str); /******End*********/ } }
测试结果