文件写入
在程序开发中,经常需要对文件进行读写操作。文件的读写操作分为两种形式,一种是以字符的形式进行写入,一种是以二进制的形式进行写入。本节将针对文件写入的相关内容进行详细地讲解。
1、使用fputc()函数向文件写入字符
fputc()函数用于向文件中写入一个字符,函数声明如下:
int fputc(int c, FILE* stream);
上述函数声明中,c表示写入的内容,stream表示一个文件指针。函数返回值的类型为int类型,即返回成功写入的字符,写入失败返回EOF。
接下来通过一个具体案例演示如何使用fputc()函数向文件写入字符,如例1所示。
例1 writeFile.c
1 #define _CRT_SECURE_NO_WARNINGS
2 #include <stdio.h>
3 #include <stdlib.h>
4 int main()
5 {
6 FILE *fp;
7 int i=0;
8 char arr[]="I Like C Program";
9 fp = fopen("hello.txt", "w"); // 以只写的方式打开一个文件,若文件不存在则创建文件
10 if (fp == NULL) // 若文件打开失败,则输出提示信息
11 {
12 printf("打开文件失败!\n");
13 exit(0); // 退出程序
14 }
15 while (arr[i] != '\0') // 遍历字符数组中的每一个字符
16 {
17 fputc(arr[i], fp); // 将字符写入文件中
18 i++; // 将字符数组的下标后移一位
19 }
20 fclose(fp); // 关闭文件,释放资源
21 return 0;
22 }
在例1中,第8行代码定义一个字符数组;第9行代码以只写的方式打开hello.txt文件;第15~19行代码通过while循环遍历字符数组将数组中的字符,并通过fputc()函数写入到文件中;第20行调用fclose()函数关闭文件。
例1运行成功后,在项目根目录下打开hello.txt文件,可以看到该文件中的内容如图1所示。
图1 hello.txt文件内容
2、使用fputs()函数向文件写入字符串
fputs()函数用于将字符串写入文件,函数声明如下:
int fputs(const char str, FILE stream);
上述函数声明中,参数str表示指向待写入的字符串的字符指针;参数stream表示文件指针。
fputs()函数向指定的文件写入一个字符串(不自动写入字符串结束标记符‘\0’),如果写入成功,函数返回0,否则返回EOF。
接下来通过一个具体案例演示如何使用fputs()函数向文件写入字符串,如例2所示。
例2 writeString.c
1 #define _CRT_SECURE_NO_WARNINGS
2 #include <stdio.h>
3 #include <stdlib.h>
4 int main()
5 {
6 FILE * fp; // 声明文件指针
7 char * str[3]; // 定义字符数组的指针
8 int i;
9 str[0] = "I Like C Program\n"; // 初始化数组指针指向的字符串
10 str[1] = "It Is Amazing\n";
11 str[2] = "It Is Interesting\n";
12 fp = fopen("hello.txt", "w"); // 打开文件,若文件不存在则创建文件
13 if(fp == NULL) // 打开文件失败,打印出错信息
14 {
15 printf("打开文件失败!\n");
16 exit(0); // 退出程序
17 }
18 for (i = 0; i < 3; i++)
19 {
20 fputs(str[i], fp); // 将字符数组str中的整个字符串写入文件中
21 }
22 fclose(fp); // 关闭文件,释放资源
23 return 0
24 }
在例2中,第5行代码定义了一个指针数组,第7~9行代码初始化了指针数组,第10行代码以只写的方式打开hello.txt文件,第16~19行代码在for循环中使用fputs()函数将字符数串写入到文件中;第20行代码调用fclose()函数关闭文件。
程序运行成功后,在项目根目录中打开hello.txt文件,发现字符串被成功写入文件,文件内容如图2所示。
图2 hello.txt文件内容
3、使用fwrite()函数向文件写入数据
fwrite()函数用于以二进制的形式将数据写入文件,函数声明如下:
size_t fwrite(const void * ptr, size_t size, size_t nmemb, FILE * stream);
上述函数声明中,参数ptr表示指向待写入数据的指针;参数size表示待写入数据的字节数;参数nmemb表示待写入size个字节的数据的个数;参数stream表示文件指针;返回值类型size_t,即无符号整型,写入成功返回写入的数据个数,写入失败返回0。
接下来通过一个具体案例来学习如何使用fwrite()函数向文件写数据,如例3所示。
例3 writeBin.c
1 #define _CRT_SECURE_NO_WARNINGS
2 #include <stdio.h>
3 #include <stdlib.h>
4 int main()
5 {
6 FILE * fp; // 声明文件指针
7 char str[26]; // 声明数据数组
8 int i, num;
9 fp = fopen("fread.txt", "w"); // 以只写方式打开一个文件,如果文件不存在则创建
10 if (fp == NULL) // 打开文件失败,打印出错信息
11 {
12 printf("文件打开失败\n");
13 exit(0); // 退出程序
14 }
15 for (i = 0; i < 26; i++) // 将26个字符循环写入数据数组
16 {
17 str[i] = 'a' + i;
18 }
19 num = fwrite(str, sizeof(char) * 13, 2, fp); // 将数据数组的内容写入到文件中
20 printf("数据的写入次数是:%d\n", num); // 打印数据的写入次数
21 fclose(fp); // 关闭文件,释放资源
22 return 0;
23 }
例3运行结果如图3所示。
图3 例3运行结果
程序执行成功后,会在项目根目录中生成fread.txt文件,打开fread.txt文件,发现字符串被成功写入文件,文件内容如图4所示。
图4 fread.txt文件内容
在例4中,第7行代码初始化一个数据数组;第9行代码以只写的方式打开fread.txt文件;第15~18行代码通过for循环将26个小写字母写入str数组;第19行代码调用fwrite()函数将str数组的数据写入到文件中e;第21行代码调用fclose()函数关闭文件。
4、使用fprintf()函数向文件写入数据
fprintf()函数用于将数据格式化写入文件,函数声明如下:
int fprintf(FILE * stream, const char * format,...);
上述函数声明中,参数stream表示文件指针;参数format表示以什么样的字符串格式输出到文件中;该函数根据指定的字符串格式将字符串写入到指定的文件中。如果函数调用成功,该函数的返回值是输出的字符数;否则,返回EOF。
接下来通过一个具体案例来演示如何使用fprintf()函数向文件写数据,如例4所示。
例4 fprintfFile.c
1 #define _CRT_SECURE_NO_WARNINGS
2 #include <stdio.h>
3 #include <stdlib.h>
4 void main()
5 {
6 FILE *fp;
7 fp = fopen("hello.txt", "w"); // 以只写的方式打开一个文件,若文件不存在则创建文件
8 if (fp == NULL) // 若文件打开失败,则输出提示信息
9 {
10 printf("打开文件失败!\n");
11 exit(0); // 退出程序
12 }
13 // 将格式化的字符串输出到文件中
14 fprintf(fp, "I am a %s, I am %d years old.", "student", 18);
15 fclose(fp); // 关闭文件,释放资源
16 }
在例4中,第7行代码以只写的方式打开hello.txt文件;第14行代码调用fprintf()函数格式化字符串并将字符串写入文件中;第15行代码调用fclose()函数关闭文件。
程序运行成功后,会在当前项目根目录下生成一个hello.txt文件,打开文件,发现字符串被成功写入文件hello.txt中,文件内容如图5所示。
图5 hellow.txt文件内容