
本关任务:将键盘输入的字符,以#代表结束,存入文件file1.txt中,并把存入的信息显示输出。
为了完成本关任务,你需要掌握:
在 C 语言中,使用 fopen() 函数来打开一个文件,该函数返回一个 FILE* 类型的指针(即文件指针 fp),其函数原型为 FILE *fopen(const char *filename, const char *mode);
例如,以只读方式打开一个名为 test.txt 的文本文件,代码如下:
#include <stdio.h>
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() 函数读取单个字符:以下是逐个字符读取文件内容并打印到控制台的示例代码:
#include <stdio.h>
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() 函数读取一行字符:示例代码如下:
#include <stdio.h>
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 的文件中:
#include <stdio.h>
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() 函数写入一行字符:示例代码如下:
#include <stdio.h>
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) 循环来读取文件内容并进行处理的示例:
#include <stdio.h>
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
开始你的任务吧,祝你成功!
#include <stdio.h>
#include <stdlib.h>
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;
}
本关任务:编写一个小程序,实现从键盘上输入若干行文本(每行不超过80个字符),写入到文件file2.txt中,用-1作为字符串输入结束的标志,然后将文件的内容读出显示在屏幕上。
为了完成本关任务,你需要掌握:
根据提示,在右侧编辑器代码文件中的 Begin-End 区间内补充代码。
平台会对你编写的代码进行测试:
测试输入: qwert asdfgh zx -1
预期输出: qwert asdfgh zx
开始你的任务吧,祝你成功!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
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*********/
}
}