数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。
⽂件在读写之前首先要打开⽂件,在使⽤结束之后应该关闭⽂件。
fopen 函数来打开⽂件, fclose 函数来关闭⽂件。
用法如下:
FILE * fopen ( const char * filename, const char * mode );//const char * filename打开的文件名。//const char * mode以读或写的方式打开文件
int fclose ( FILE * stream );//关闭文件
“r”(只读) | 为了输⼊数据(文件里面的数据向外输出),打开⼀个已经存在的⽂本⽂件。如果文件不存在,结果会报错。 |
“w”(只写) | 为了输出数据(向文件里写数据),打开⼀个⽂本⽂件。如果文件不存在,建立一个新文件。 |
“rb”(只读) | 为了输⼊数据,打开⼀个⼆进制⽂件。如果文件不存在,结果会报错。 |
“wb”(只写) | 为了输出数据,打开⼀个⼆进制⽂件。如果文件不存在,建立一个新文件。 |
例如:
int main()
{
FILE* pf = fopen("text.txt", "w");//以写的形式打开一个text.txt文件
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
fclose(pf);关闭文件
pf = NULL;//将文件置空
return 0;
}
顺序读写函数如下:
我对输入输出的理解是计算机相当于人的大脑,向大脑里输送文件就是输入。从大脑里向外输送就是输出。
fgetc | 字符输⼊函数(文件里面的数据向外读) |
fputc | 字符输出函数(向文件里写数据) |
fgets | ⽂本⾏输⼊函数 |
fputs | ⽂本⾏输出函数 |
fscanf | 格式化输⼊函数 |
fprintf | 格式化输出函数 |
fread | ⼆进制输⼊ |
fwrite | ⼆进制输出 |
fgetc和fputc函数:
int main()
{
FILE* pf = fopen("text.txt", "w");//以写的形式打开文件
if (pf == NULL)
{
perror("fopen");
return 1;
}
char ch = 0;
for (ch = 'a'; ch <= 'z'; ch++)//写内容
{
fputc(ch, pf);
}
fclose(pf);//关闭文件
pf = NULL;
return 0;
}
int main()
{
FILE* pf = fopen("text.txt", "r");//已读的形式打开文件
if (pf == NULL)
{
perror("fopen");
return 1;
}
int ch = 0;
while ((ch = fgetc(pf)) != EOF)//读文件中的字符
{
printf("%c\n", ch);//打印到屏幕上
}
fclose(pf);//关闭文件
pf = NULL;
return 0;
}
fputs和fgets函数:
int main()
{
FILE* pf = fopen("test.txt", "w");//以写的形式打开文件
if (pf == NULL)
{
perror("fopen");
return 1;
}
fputs("hello world\n", pf);//写文件,换行会自己添加\n
fputs("hello china", pf);
fclose(pf);//关闭文件
pf = NULL;
return 0;
}
int main()
{
FILE* pf = fopen("test.txt", "r");//以读的形式打开文件
if (pf == NULL)
{
perror("fopen");
return 1;
}
//fgets(arr, 10, pf);//读文件时实际上读10-1个数据
char arr[20] = { 0 };//读文件
while (fgets(arr, 20, pf) != NULL)
{
printf("%s", arr);//默认有\n,所以不需要加\n
}
fclose(pf);//关闭文件
pf = NULL;
return 0;
}
fscanf和fprintf函数:
struct S
{
char name[20];
int age;
float score;
};
int main()
{
struct S s = { "张三",20,65.5f };
FILE* ptr = fopen("test.txt", "w");//以写的形式打开文件
if (ptr == NULL)
{
perror("fopen");
return 1;
}
fprintf(ptr, "%s %d %f", s.name, s.age, s.score);//fprintf是向文件中写数据
fclose(ptr);//关闭文件
ptr = NULL;
return 0;
}
int main()
{
struct S s = { 0 };
FILE* ptr = fopen("test.txt", "r");//以读的形式打开文件
if (ptr == NULL)
{
perror("fopen");
return 1;
}
fscanf(ptr, "%s %d %f", s.name, &(s.age), &(s.score));//fscanf从文件中读取数据放在s中
printf("%s %d %f", s.name, s.age, s.score);//读取的内容打印在屏幕上
fclose(ptr);//关闭文件
ptr = NULL;
return 0;
}
fread和fwrite函数:
int main()
{
int arr[] = { 1,2,3,4,5,6 };
FILE* pf = fopen("test.txt", "wb");//以二进制写的形式打开文件
if (pf == NULL)
{
perror("fopen");
return 1;
}
int sz = sizeof(arr) / sizeof(arr[0]);
fwrite(arr,sizeof(arr[0]),sz,pf);//以二进制形式写。
//size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );fwrite用法中const void * ptr是要放的数据,size_t size是元素大小。
//size_t count是放多少个数据,FILE * stream是放到那个文件
fclose(pf);
pf = NULL;
return 0;
}
int main()
{
int arr[5] = { 0};
FILE* pf = fopen("test.txt", "rb");//以二进制形式读。
if (pf == NULL)
{
perror("fopen");
return 1;
}
fread(arr, sizeof(arr[0]), 5, pf);//以二进制形式读,用法和fwrite一样。
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
fclose(pf);
pf = NULL;
return 0;
}
⽂件读取结束的判定
//feof的作⽤:当⽂件读取结束的时候,判断是否遇到⽂件尾结束
//ferror:读取的时候发生错误
//fgetc 如果读取正常,返回的是读取到字符的ASCLL码值。读取过程中遇到文件末尾或者发生错误返回EOF
//fgets 如果读取正常,返回的是存储读取到的字符串的字符数组的地址。读取过程中遇到文件末尾或者发生错误返回NULL
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
int ch = 0;
while ((ch = getc(pf)) != EOF)
{
printf("%c\n", ch);
}
if (feof(pf))
printf("遇到文件末尾,读取正常结束\n");
else if (ferror(pf))
perror("fgetc");
fclose(pf);
pf = NULL;
return 0;
}