一、读写文件步骤
- 打开文件
- 读写文件
- 关闭文件
二、具体操作
1. 定义文件
FILE *fp;
/* 文件指针file pointer*/
2. 打开文件
FILE *fp fopen(const char *filename, const char *mode)
/* 文件指针file pointer,正常返回一个fp指针,失败返回NULL*/
参数:
- filename:文件名,如“demo.txt", “D:\\code\\demo.txt”
- mode:读写的模式。
名称 用法 w 只写,(文件不存在时创建文件,如果有文件则覆盖) r 只读,(文件不存在时报错) a 追加,文件不存在时报错 w+ 可读可写,(文件不存在创建文件) r+ 可读可写,(文件不存在时报错) a+ 可读可写,(文件不存在时报错) wb 二进制写,与w类似 rb 二进制读,与r类似 ab 二进制追加,与a类似 Note wb+,rb+,ab+都是二进制操作,可读可写
/* 下面是打开文件的一个例子*/
fp = fopen("demo.txt", "w"); /* 写的方式打开一个文件,如果没有回创建*/
if (fp == NULL)
{
printf("Error: Failure to open demo.txt\n");
exit(0);
}
/************************************************************/
/*下面的程序与上面功能一项,比较简洁。建议使用下面的程序*/
if ((fp = fopen("demo.txt", "w") == NULL))
{
printf("Error: Failure to open demo.txt\n");
exit(0);
}
3. 读写文件(4种方式分别介绍)
- 按 字符 读写:fputc,fgetc
- 按 字符串 读写:fputs,fgets
- 按 格式 读写:fscanf,fprintf
- 按 块 读写:fread,fwrite
3.1 按 字符 读写:fputc,fgetc
下面给出两个例子:
Example 1:
/*例子1:将一串字符写入demo.txt文件中,以换行符结束 */
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
char ch;
if ((fp = fopen("demo.txt", "w")) == NULL)
{
printf("Error: Failure to open demo.txt");
exit(0);
}
ch = getchar();
while(ch != '\n') /* 当遇到换行符时直接退出*/
{
fputc(ch, fp); /* 按字符串写入到fp所指向的文件中*/
ch = getchar();
}
fclose(fp); /*打开文件和关闭文件一定是成对出现的*/
return 0;
}
输入下面的内容:Rome was not built in a day.
并回车。
打开Rome.txt文件,结果如下:
Example 2:
/*例子2:把0~127的ASCII字符输入到demo.bin二进制文件中,并且从demo.bin文件中读出*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
char ch;
int i;
if ((fp = fopen("demo.bin", "wb")) == NULL)
{
printf("Error:Failure to open demo.bin\n");
exit(0);
}
for (i = 0; i < 128; i++)
{
fputc(i, fp);
}
fclose(fp);
/* 上面写完成,下面开始读*/
if ((fp = fopen("demo.bin", "rb")) == NULL)
{
printf("Error:Failure to open demo.bin\n");
exit(0);
}
while((ch = fgetc(fp)) != EOF)
{
putchar(ch);
}
fclose(fp);
return 0;
}
读出的二进制文件结果如下:
3.2. 按 字符串 读写:fputs,fgets
3.3. 按 格式 读写:fscanf,fprintf
如果有一个 数据结构体 (学生),里面有学生学号,姓名,年龄,出生日期等信息,非常复杂,这个时候上面的输入方式就很难完成效果了,这个时候就用 “按格式写入和读出” 的方式。
Example 3:
#include <stdio.h>
#include <stdlib.h>
typedef struct date
{
int year;
int month;
int day;
} DATE;
typedef struct student
{
long studentID;
char studentName[10];
char studentSex;
DATE birthday;
int score[4];
} STUDENT;
int main()
{
FILE *fp;
STUDENT stu[10];
int i, j;
int n, m = 4; /* n:学生数,m:课程数*/
printf("Input number of students:\n");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("Input Num.%d student:\n", i + 1);
scanf("%ld %s %c %d %d %d", &stu[i].studentID, stu[i].studentName, &stu[i].studentSex,
&stu[i].birthday.year,
&stu[i].birthday.month,
&stu[i].birthday.day);
for (j = 0; j < m; j++)
{
scanf("%d", &stu[i].score[j]);
}
}
/* 按格式写入文件*/
if ((fp = fopen("demo.txt", "w")) == NULL)
{
printf("Error: Failure to open demo.txt\n");
exit(0);
}
for (i = 0; i < n; i++)
{
fprintf(fp, "%10ld%8s%3c%6d/%02d/%02d",stu[i].studentID, stu[i].studentName, stu[i].studentSex,
stu[i].birthday.year,
stu[i].birthday.month,
stu[i].birthday.day);
for (j = 0; j < m; j++)
{
fprintf(fp, "%4d", stu[i].score[j]);
}
fprintf(fp, "\n");
}
return 0;
}
输入:(输入信息并按回车)
输出:
Note : 如果要读出的话,则用fscanf就行了。
3.4. 按 块 读写:fread,fwrite
4. 关闭文件
int fclose(*fp);
/* 关闭 fp指针所对应的文件 */
Note:打开文件和关闭文件必定是成对存在的。
三、其他函数
fseek(fp,offset,fromwhere)
定位函数,把fp的指针设为从fromwhere的位置加上offset的偏移。其中fromwhere有3个值。
- SEEK_SET / 0 文件起始位置
- SEEK_CUR / 1 文件当前位置
- SEEK_END / 2 文件结束位置
rewind(fp);
使指针回到文件头部。long ftell(fp);
返回当前位置的指针(相对于文件起始位置的字节偏移量)
四、参考文献与感谢
本篇文章是看过哈工大苏小红老师的视频后总结的。老师讲的透彻且通俗易懂,表示感谢!!!