一、什么是文件,文件包含什么,文件类型有什么???
答:文件:存储在磁盘上的文件是文件。C语言中我们谈的文件有两种**:程序文件和数据文件。**
程序文件 :包括源文件(.c),目标文件(windows环境是.obj),可执行文件(windows环境是.exe)
数据文件 :是程序运行时读写的数据,比如程序运行时需要从中读取数据的文件,或者输出内容的文件。
文件包含文件的内容和文件的属性。
C语言中的数据文件有二进制文件和文本文件。
二进制文件:数据存储时以二进制的形式存储,不加转换的输出到内存,就是二进制文件。
文本文件:如果要求在内存上以ASCII码存储,则需要在存储前转换。以ASCII字符的形式存储的文件时文本文件。
二、基本函数的使用
(1)、fopen函数
文件打开函数。
FILE*fopen(const char *filename,const char mode);
函数返回值是FILE型(文件指针)
filename是要打开的文件名
mode是打开方式
打开方式有
r (只读,为了输入数据,打开一个已经存在的文本文件)、
w(只写,为了输出数据,打开一个文本文件)、
a(追加,向文件尾添加数据)、
rb(只读,打开一个已经存在的二进制文件),
wb(只写,为了输出数据,打开一个二进制文件),
r+(读写,打开一个文本文件)、
w+(读写,建议一个新的文件)
a+((读写,打开一个文件,在文件末尾添加数据);
rb+(为了读写,打开一个二进制文件)
wb+为了读写,新建一个新的二进制文件。
ab+打开一个二进制文件,文件尾进行读写。
举个例子:
#include<stdio.h>
#include<stdio.h>
#pragma warning(disable:4996)
int main()
{
FILE* fp;
fp = fopen("myfile.txt", "w");//如果没有这个文件,新建在源文件目录下。
//也可以通过文件路径打开
//文件打开,关闭,返回值都是FILE*型
if (fp == NULL)
{
printf("open error");
return 1;
}
else
{
fputs("fopen example", fp);//将fopen输入到文件myfile.txt中
}
fclose(fp);//关闭函数
return 0;
}
打开这个文件:右键源文件,添加,现有项,就会看到文件,添加在源文件目录下,右键,打开方式,最下边是二进制文件打开,最上边是文本文件打开。
如果你在以w形式打开一次文件,里边的东西会消失。
如果以r和方式打开,不会消失。
int main()
{
FILE* fp;
fp = fopen("myfile.txt", "w");
if (fp == NULL)
{
printf("open error");
return 1;
}
else//打开成功之后,之前写的fopen example 消失了。
{
fputs("hello wolrd", fp);//写入新的字符。
}
fclose(fp);
fp=fopen("myfile.txt", "r");
if (fp == NULL)
{
printf("open error");
return 1;
}//如果打开成功,hello world还在。
fclose(fp);
fp = fopen("myfile.txt", "a");
if (fp == NULL)
{
printf("open error");
return 1;
}
else
{
fputs("123a45", fp);//在文件末尾在添加字符
}
fclose(fp);
return 0;
结果如下:。
(2)、fseek函数
跟据文件指针的位置和偏移量来定位文件指针。
int fseek (FILE* stream,long int offset ,int origin)
stream :想对那个文件修改,offset :偏移量,origin :选择基准,有SEEK_SET(从起始位置开始)、SEEK_END(从文件末尾开始)、SEEK_CUR(文件指针指向的当前位置)
举个例子:
int main()
{
FILE* fp;
fp = fopen("myfile.txt", "wb");
if(fp==NULL)
{
perror("Error opening file.");
}
else
{
fputs("This is an apple .",fp);
fseek(fp, 9, SEEK_SET);//从起始位置,数9个开始修改
fputs("sam", fp);//用sam替换了三个。
}
fclose(fp);
return 0;
}
(3)、ftell函数
ftell函数返回文件相对于起始位置的偏移量;
long int ftell(FILE * stream);
举个例子:
int main()
{
long size=0;
FILE* fp;
fp = fopen("myfile.txt", "r");//内容是 This is asampple.
if (fp == NULL)
{
perror("Error opening file");//打印错误信息。
}
else
{
fseek(fp, 0, SEEK_END);//让fp指向文件尾,偏移量就是整个文件的大小。
size = ftell(fp);
printf("size of myfile.txt :%ld bytes.\n", size);
}
return 0;
}//可以计算文件的大小
(4)、rewind 函数
让文件指针的位置回到文件的起始位置。
void rewind(FILE*stream)
和fseek 的fseek(fp,0,SEEK_SET),相似。
举个例子:
int main()
{
int n = 0;
FILE* fp;
char buffer[27];
fp = fopen("myfile.txt", "w+");//原始内容被清除
if (fp == NULL)
{
perror("Error opening file");
}
else
{
for (n = 'A'; n <= 'Z'; n++)
{
fputc(n, fp);//写完之后文件指针在文件末尾
}
rewind(fp);//文件指针在文件初始位置
fread(buffer, 1, 26, fp);
//从fp文件中读取26的大小为1字节的数据,放到buffer中
}
fclose(fp);
buffer[26] = '\0';
puts(buffer);//buffer打印在显示器上
return 0;
}
(5)fread函数
size_t fread(void ptr,size_t size ,size_t count,FILEfp)
将fp中的count个大小为size的数据读入ptr中。
(6)fwrite函数
size_t fwrite(void ptr,size_t size ,size_t count,FILEfp)
将ptr 内容写在fp中,size 一个的大小,count 多少个。
这两个函数在其他函数例子中会使用到,就不举例子了。
(7)feof函数
用feof判断文件读取结束。
文本文件判断结尾的时候不能直接使用feof函数的返回值直接判断,要文本文件一直读取,直到读取出错,在用feof判断。
文本文件读取是否结束后,判断返回值EOF(fgetc),NULL(fgets);
文件读取结束有两种可能,1 读取出错,2读取结束,所以不能直接使用feof,
举例子:
#include<stdio.h>
#include<stdio.h>
#pragma warning(disable:4996)
int main()
{
char buffer[100];
int c;
FILE* fp = fopen("myfile.txt", "r");
if (fp == NULL)
{
printf("open error");
return 1;
}
else
{
if (fgets(buffer,100,fp) != NULL)
{
puts(buffer);
}
/*while ((c = fgetc(fp)) != EOF)
{
putchar(c);
}*/
if (feof(fp))
{
puts("End of file reached successfully");
}
}
return 0;
}
判断二进制文件读取是否结束
fread 判断返回值是否小于实际要读的个数。
例子:
#include<stdio.h>
#include<stdio.h>
#pragma warning(disable:4996)
enum {SIZE =8};
int main()
{
double a[SIZE] = { 1.0 ,2.0, 3.0, 4.0, 5.0 ,6.0,7.0,8.0};
double b=0.0;
size_t ret = 0;
FILE* fp = fopen("hehe.bin", "wb");
if (fp == NULL)
{
return 1;
}
else
{
fwrite(a, sizeof(double), SIZE, fp);
}
fclose(fp);
fp = fopen("hehe.bin", "rb");
while ((ret = fread(&b, sizeof(double), 1, fp)) >= 1)
{
printf("%lf", b);
}
if (feof(fp))
{
printf("Error reading :unexpected end of file\n");
}
fclose(fp);
return 0;
}