文件一般指存储在外部介质(如磁盘磁带)上的集合;
·操作系统是以文件为单位对数据进行管理的,输入输出是数据传送的过程,数据如流水一般从一处流向另一处,因此将输入输出形象地称为流,即输入输出流;
·C语言把文件看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。
·一个输入输出流就是一个字节流或者二进制流;
1,概念:一个文件要有一个唯一的文件标识,以便用户识别和引用;
2,组成:
(1)文件路径//表示文件在外部存储设备中的位置;
(2)文件标识:文件名字
(3)文件后缀:表示文件的性质//如:txt、doc、c、cpp
1,根据数据的组织形式,数据文件可分为ASCII文件和二进制文件;
·ASCII文件(文本文件):每一个字节放一个ASCII代码;
·二进制文件:把内存中的数据按照其在内存中的存储形式原样输出到磁盘上存放;
2,两种文件比较
·ASCII文件便于对字符进行逐个处理,也便于输出字符。但一般占存较多,需要转换时间;
·二进制文件可以节省空间和节约时间,但不能直接输出字符形式;
1,文本文件中数据是以字符形式呈现的,每一个字符占用一个 字符,而字节在计算机中又是以ASCII码来识别的;
例子:在内存中将整数 123 以文本形式存放;
‘1’(49) | ‘2’(50) | ‘3’(51) |
---|---|---|
0011 0001 | 0011 0010 | 0011 0011 |
2,二进制文件在存储数据时是直接以二进制方式进行的,这种存储形式与流相同;
例子:在内存中将整数 123 以二进制形式存放;(用short类型)
123(short) | |
---|---|
0000 0000 | 0111 1011 |
ANSIC标准采用“缓冲文件系统”处理文件;
·缓冲文件系统:系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区;
·从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区之后才一起送到磁盘;
1,C语言内置的文件指针类型 FILE*;
2,在标准输入输出库中,系统定义了三个FILE型的指针变量;
·stdin(标准输入文件指针):指向在内存中与键盘相应的文件信息区,意味着要用键盘输入;
·stdout(标准输出文件指针):指向在内存中与显示器屏幕相应的文件信息区,意味着输出到屏幕;
·stder(标准错误文件指针):用来输出错误文件的信息,输出到显示器屏幕;
1,位置指针用来指示当前的读写位置;
2,一般情况下,在对字符文件进行顺序读写时,文件的位置指针指向文件开头,
这时进行读操作,就读第一个字符,然后文件的位置指针顺序向后移一个位置,下一次执行度操作是,就将指针指向的第二个字符读入,以此类推,直到文件尾;
3,有时希望在一个文件的原有数据之后再添加新的数据,应该把文件位置指针移到文件尾,接着再写入新的数据,这就是文件的追加;
1,文件的打开(fopen函数)
·FILE* fp=fopen(文件名,操作方式);
·文件名:准备访问的文件的名字;
·操作方式:读还是写;
·让哪一个指针变量指向被打开的文件;
【注意:使用时要判断】
如:
FILE* fp = fopen("666.txt", "w");
if (fp==NULL)
{
perror("文件打开失败");
return;
}
fclose(fp);
2,文件的关闭(fclose)【注意:每打开一个文件,使用完了必须相应的关闭文件】
·fclose(文件指针);
·功能:关闭文件,释放文件指针;
3,文件的操作方式
·"r" (只读)为输入打开一个文本文件 文件必须存在;
·"w" (只写)为输出打开一个文本文件 存在则删除重新建,不存在则创建;
·"a" (追加)向文本文件尾增加数据 文件必须存在;
·"rb" (只读)为输入打开一个二进制文件 文件必须存在;
·"wb" (只写)为输出打开一个二进制文件;
·"ab" (追加)向二进制文件尾增加数据;
·还可以在操作方式后加上 + 号,表示可读可写,如:r+,为可读可写;
1,逐个字符读写
1,向文件中写入字符
·fputc(ch,fp);
功能:将字符输出到fp所指向的文件中去;
返回值: 成功,返回输出的字符;
失败,返回一个EOF;
2,从文件读取一个字符
·char ch;ch=fgetc(fp);
功能:从文件中获取一个字符,并赋值给ch;
返回值:如果在执行fgetc函数读字符时,遇到文件结束符,函数返回一个文件结束标志EOF(-1);
2,字符串读写
1,向文件中写入一个一个字符串;
·int fputs(const char* str,FILE *fp);
·返回值:成功,返回非负整数;
失败,返回EOF(-1);
2,从文件中读取一个字符串;
·char* fgets(char* str,int n,FILE *fp);//n为读取字符串的大小
1,EOF判断文件结束,EOF是一个宏(-1);
使用方法:
if(fgets(文件变量名)==EOF)//例子
{
break;
}
2,feof(),如果读到文件结尾,会返回一个非零值,如果没有结束就会返回0
使用方法:
if(feof(文件指针变量名))
{
break;
}
1,相对路径:相对于程序来说,程序在那个目录,那么相对路径也在这个目录; 表示方式: “ . / ”,表示在当前路径下,可写可不写;
2,绝对路径:带盘符的路径,如:D:、C: ;
//具体例子
#include
#include
int main(int argc, char* argv[])
{
//argc是命令行参数个数
//argv是命令行参数数组
char total[BUFSIZ] = { 0 };
if (argc == 3)
{
FILE* pdes = fopen(argv[1], "r");
if (pdes == NULL)
{
perror("eroor");
return -1;
}
while (!feof(pdes))
{
char buf[BUFSIZ] = { 0 };
fgets(buf, BUFSIZ, pdes);
strcat(total, buf);
}
fclose(pdes);
FILE* parr = fopen(argv[2], "w+");
if (parr == NULL)
{
perror("errpr");
return -1;
}
int flag = fputs(total, parr);
if (!flag)
{
printf("copy victory");
}
fclose(parr);
}
return 0;
}
//具体例子
int main(int argc, char* argv[])
{
char total[BUFSIZ] = { 0 };
if (argc == 3)
{
FILE* pdes = fopen(argv[1], "rb");
//【注意:因为图片是二进制文件,所以操作方式后要加b】
if (pdes == NULL)
{
perror("eroor");
return -1;
}
FILE* parr = fopen(argv[2], "wb");
if (parr == NULL)
{
perror("errpr");
return -1;
}
while (1)
{
char ch = fgetc(pdes);
if (feof(pdes))
{
break;
}
fputc(ch, parr);
}
fclose(pdes);
fclose(parr);
}
return 0;
}
1,向文件中格式化写数据;
·fprintf(FILE* fp,char* Format,参数列表);
例子:fprintf(fp, “%d %d %s”, 999, 2222, “ol”);
2,从文件中格式化读取数据;
·fscanf(FILE* fp,char* Format,参数地址列表);
例子:fscanf(fp, “%d %d %s”, &age, &hight,name);
1,向文件写入二进制数据;
·fwrite(const*Buffer,int Size,int Count,FILE *fp);
2,从文件中读取二进制数据;
·fread(const*Buffer,int Size,int Count,FILE *fp );
参数说明:
·Buffer:是一个指针;
1, 对fread来说,是读入数据的存放地址;
2, 对fwrite来说,是要输出的数据地址;
·Size:是要读写的字节数;
·Count:要进行读写多少个Size字节的数据项;
`fp:文件指针;
1,顺序读写:位置按字节位置顺序移动;
2,随机读写:读完上一个字符(字节)后,并不一样要读写其后续的字符,而可以读写文件中任意位置上所需的字符;
3,C语言提供以下有关函数,使位置指针指向指定的位置;
·rewind(fp)函数:是使位置指针所返回文件的开头,此函数没有返回值;
·int fseek(FILE* fp,long Offset,int Origi);
参数说明:
·fp: 文件指针;
·offset: 以起始点为基点,向前移动的字节数;
·origi: 文件开头(SEEK_SET 0) 文件当前位置(SEEK_CUR 1) 文件末尾(SEEK_END 2)
`ftell(FILE* fp) :得到当前位置指针的位置,用相对于文件开头的位移量来表示;
//成功则返回当前位置,失败返回EOF(-1);
具体说明:
rewind(fp);//把位置指针移动到开头,从头开始读;
fseek(fp,0,SEEK_SET);//和rewind等价
fseek(fp,1,SEEK_SET);//从当前位置后移1位;
fseek(fp,-4,SEEK_SET);//位尾往前移动5位;
1,在文件夹上方,输入cmd进入命令行窗口
2,用(>复制 >>追加)将指定内容复制到文档下
例子:输入igconfig > 666.txt //将IP地址内容,复制到666.txt中,没有文档会自动创建