c语言的文件操作
一.文件处理步骤
(1)声明一个FILE*类型的变量
(2)打开文件:调用fopen()函数将文件指针与这个文件相连
(3)文件处理
(4)关闭文件:调用fclose()函数
二.打开与关闭文件
FILE * fopen(const char * path,const char * mode);
(1)该函数有返回值。若打开失败会返回一个NULL的FILE指针。因此常常在fopen后加错误判断处理。
if ((fp = fopen("abc.txt", "r")) == NULL){
printf("File open error!\n");
exit(0);
}
(2)第一个参数是文件的路径及文件名,第二个参数表示进行什么操作
使用方式 | 含义 |
---|---|
“r” /”rb” | 打开文本文件/二进制文件 进行只读 |
“w”/”wb” | 建立新的文本文件/二进制文件 进行只写 |
“a”/”ab” | 打开文本文件/二进制文件 进行追加 |
“r+”/”rb+” | 打开文本文件/二进制文件 进行读写 |
“w+”/”wb+” | 建立新的文本文件/二进制文件 进行读写 |
“a+”/”ab+” | 打开文本文件/二进制文件 进行读写或追加 |
(3)打开文件时注意以下规则:
①如果读文件的话,文件必须存在否则会出错。写文件的话文件可以不存在
②以w方式写文件,文件如果存在,会将源文件删去重新建一个新的;文件如果不存在,正好按指定的名字建立一个新的文件。
③若不想在写文件时把原有文件的内容给删了,应该用a的方式写文件。
④文件同时读写使用r+,w+,a+
三.关闭文件
fclose (文件指针)
该函数将返回一个整数,若为0表示正常关闭文件,否则表示无法正常关闭文件,所以关闭文件时也要有一条条件判断。
四.文件读写
C语言标准库stdio.h中提供的文件读写函数:
- fgetc() 调用形式ch = fgetc(文件指针) 作用是从文件中读一个字符到ch
函数返回一个整形值,EOF是-1。
注意:fgetc在读到有效的字符时,会向后移动指针,若读到文件末尾,则会读到EOF - fputc() 调用形式 fputc(ch, 文件指针) 作用是将一个字符写到文件上,
函数返回值:写文件成功返回ch 失败返回EOF - feof() 调用形式:feof(fp) 检测文件指针所指的位置是否到了文件末尾
/*复制数据,从文件1读取,写入文件2*/
while(! feof(fp1))
{
ch = fgetc(fp1);
if (ch != EOF) fputc(ch, fp2);
}
- fgets() 调用形式fgets(s, n, fp) s为字符数组名或字符指针,n是指定读入的字符个数,fp为文件指针。注意:函数被调用时,最多读取n-1个字符,当函数读取的字符达到n-1个或者接收到换行符或收到文件末尾EOF,将在字符串末尾自动添加一个’\0’
函数返回值:成功返回读取的字符串,失败返回空指针 fputs() 调用形式fputs(s, fp) 向文本文件写入一个字符串
函数返回值:成功返回所写的最后一个字符,失败返回EOFfscanf() fprintf()
调用格式:fscanf(文件指针,格式字符串,输入表)
fprintf(文件指针,格式字符串,输出表)
五.二进制文件操作
对于二进制文件,第一步是打开文件的时候要建立二进制进行读写的方式加个b。
二进制文件常用下面的函数操作:
fread(buffer, size, count, fp);
fwrite(buffer, size, count, fp);
fread与fwrite用于读写数据块,可用来读一组数据,如一个数组元素,一个结构变量的值等。buffer表示一个指针,存放输入数据的首地址。size表示数据块的字节数,count表示要读写的数据块数目,fp表示文件指针。
/*
*编程实现以二进制方式读写用户信息文件f12-5.dat,
*将5位用户信息(用户名和密码,密码要求经过例12-2的encrypt()函数加密)写入文件,
*然后读出所有用户信息显示到屏幕。
*/
#include <stdio.h>
#include <string.h>
#include<process.h>
#define SIZE 5 /*用户个数*/
struct sysuser{ /*用户信息结构体*/
char username[20];
char password[8];
};
void encrypt(char *pwd);
int main(void)
{
FILE *fp; /*1.定义文件指针*/
int i;
struct sysuser u[SIZE],su[SIZE],*pu=u,*psu=su;
/*2.打开文件,建立二进制文件进行读/写方式*/
if((fp=fopen("f12-5.dat","wb+")) == NULL){
printf("File open error!\n");
exit(0);
}
/*3.输入SIZE个用户信息,并对密码加密,保存到结构体数组u */
for(i=0;i<SIZE;i++,pu++){
printf("Enter %i th sysuser(name password):",i);
scanf("%s%s",pu->username,pu->password); /*输入用户名和密码*/
encrypt(pu->password); /*调用加密算法对密码进行加密处理*/
}
pu=u;
fwrite(pu,sizeof(struct sysuser),SIZE,fp);/*写入二进制文件*/
rewind(fp); /*将指针重新定位到文件首*/
fread(psu,sizeof(struct sysuser),SIZE,fp);/*读取SIZE条数据到psu指向的结构数组*/
for(i=0;i<SIZE;i++,psu++)
printf("%s\t%s\n", psu->username, psu->password);
/*关闭文件*/
if(fclose(fp)){
printf("Can not close the file!\n");
exit(0);
}
return 0;
}
/*加密函数,对pwd进行加密处理*/
void encrypt(char *pwd)
{
int i;
/*与15异或,实现低四位取反,高四位保持不变*/
for(i=0;i<strlen(pwd);i++) pwd[i] = pwd[i]^15;
}