一. 文件的分类:
1. 从用户角度分: 普通文件和设备文件.
2. 从文件编码方式分:
(1). 文本文件: 用记事本能正常打开的文件, 如” .txt”, “.c”
(2). 二进制文件: 用记事本打开为乱码的文件, 如” .mp3”, “ .jpg”
二. 文件的操作:
一般步骤为:
(1). 引入头文件(stdio.h).
(2). 定义文件指针.
(3). 打开文件.
(4). 文件读写(同一时间只能读或写, 不要又读又写).
(5). 关闭文件.
1. 打开和关闭文件:
①. 打开: fopen
格式为: fopen(文件名, 方式); 如: fopen(“ c:\\a.txt”,“r”);
打开方式 | 含 义 |
r(读) | 打开一个已存在的文件, 准备从文件中读取数据处理不能向文件写数据 |
w(写) | 创建一个新文件, 准备向文件写入数据, 不能从文件中读取数据. 如果文件已存在, 则覆盖已有文件 |
a(追加) | 打开一个已存在的文件, 准备在文件尾部追加数据. 不能从文件中读取数据, 如果文件不存在, 则创建这个文件准备写入数据 |
②. 关闭: fclose
格式为: fclose(文件名);
2. 定义文件指针:
格式: 文件指针名=文件函数(文件名, 方式); 如:
FILE *file=fopen(“ c:\\a.txt”, “r”);
3. 文件函数名:
(1). fgetc(读一个字符) 和 fputc(写一个字符):
①. fgetc函数格式: fgetc(指针文件);
如: fgetc (file);
②. fputs函数格式: fputc(字符或数字变量, 指针文件);
如: fputc ( chTemp, file );
fgetc用法: fputc用法:
int main( int argc , char **argv ) int main( int argc , char **argv )
{ {
char chTemp = 0; char chTemp= 0;
const char * pFileName = "c:\\a.txt"; // 定义文件指针. constchar * pFileName = "c:\\a.txt"; // 定义指针文件
FILE* file = fopen( pFileName , "r"); // 以r(读)的方式打开文件. FILE*file = fopen( pFileName , "w" ); // 以w(写)的方式打开文件
if( NULL == file ) // 判断是否打开成功. if(NULL == file ) // 判断是否打开成功
{ {
printf( " The fileopen failed ... \n" ); printf( " The file open failed ... \n");
return 0; return 0;
} }
printf( "请输入:" );
while(1) while(1)
{ {
chTemp = fgetc( file ); //读字符 chTemp= getch();
if( EOF == chTemp) //判断结束. EOF返回值为-1 if( 27 == chTemp ) // esc 键退出
{ {
break; break;
} }
printf("%c", chTemp ); if( '\r' == chTemp )
} {
fclose( file ); //打开了后一定要关. putchar ( '\n' ); // 输入 '\r', 输出 '\n'
fputc( '\n', file ); //把\n写入文件
return 0; {
} else
{
putchar (chTemp); // 回显
fputc(chTemp, file ); // 写文件
}
}
fclose( file );
return0;
}
(2). fgets(读一个字符串) 和 fputs(写入一个字符串):
①. fgets函数格式:fgets(字符串指针, 数量, 文件指针);
如: fgets(pBuffer, 100, file);
结束: a. 读完限定数量后结束.
b. 读到回车结束.
②. fputs函数格式:fputs(字符串指针, 文件指针);
※ 读完后输出的串和原串不同. 原串
输出后的新串
如: fputs( pUserArray[i].m_szName, file );
fgets用法: fputs用法:
int main( int argc , char **argv ) struct stUser
{ {
char * pBuffer = (char *)malloc( sizeof(char)*100 ); char m_szName[100];
const char * pFileName = "c:\\user.ini"; // 定义指针文件 char m_szPasswd[7];
FILE* file = NULL; };
file = fopen( pFileName , "r" ); // 以r方式打开文件
int main( int argc , char **argv )
if( NULL == file ) // 判断是否成功打开 {
{ char * pBuffer = (char*)malloc( sizeof(char )*100 );
printf( " The fileopen failed ... \n" ); const char *pFileName = "c:\\userInput.ini"; //定义指针文件
return 0; FILE*file = NULL;
}
int i = 0;
while(1) //定义结构指针
{ struct stUser* pUserArray = (struct stUser*)malloc( sizeof(struct stUser )*3 );
memset( pBuffer, 0, 100 );
fgets( pBuffer, 100, file ); for( i=0; i<3; ++i )
if( 0 == strlen(pBuffer) ) // 判断结束, 一定要有, 不然就算 {
{ 文件结束了, 还会照样读, 就出错了 printf("请输入用户名: " );
break; gets( pUserArray[i].m_szName );
} printf( "请输入密码:" );
printf( "%s",pBuffer ); // 回显(不用加’\n’, fgets会自动加) gets( pUserArray[i].m_szPasswd );
} }
/*
fclose( file ); for( i=0; i<3; ++i) //测试是否输入成功
free( pBuffer ); {
printf( "用户名: %s\n",pUserArray[i].m_szName );
return 0; printf( "密码: %s\n: ", pUserArray[i].m_szPasswd );
} }*/
file= fopen( pFileName , "w" );
if( NULL == file ) // 判断是否成功打开
{
printf( " The file open failed ... \n");
return 0;
}
for( i=0; i<3; ++i )
{
fputs("[user]\n", file );
fputs("name=", file );
fputs(pUserArray[i].m_szName, file ); // 保存名字
fputc('\n', file );
fputs("passwd=", file );
fputs(pUserArray[i].m_szPasswd, file ); // 保存密码
fputc('\n', file );
}
free(pUserArray);
fclose(file);
return 0;
}
(3). fprintf 和 fscanf: 格式化的文件读写.
①. fprintf函数格式: fprintf(文件指针, 格式字符串, 对应类型的内容);
如:fprintf( file, "%s %d %c\n" , "zhang", 20, 'M' )
②. fscanf函数原形:fscanf(文件指针, 格式字符串, 对应类型的指针);
如:fscanf( file, "%s %d %c" , pName, &nAge, &chSex );
用法: int main(int argc , char **argv )
{
// 写文件
char * pName = (char *)malloc( sizeof(char )*100 );
int nAge = 0;
char chSex= 0;
const char *pFileName = "c:\\userInput.ini";
FILE*file = NULL;
int i = 0;
file =fopen( pFileName , "w" );
if( NULL == file )
{
printf( " The file open failed ... \n");
return 0;
}
fprintf( file, "%s %d %c\n" , "zhang", 20, 'M' );
fprintf( file, "%s %d %c\n" , "li", 30, 'F' );
for( i=0; i<2; ++i ) //要把前面的打开方式改为”r”才能用
// 读文件
{
fscanf( file, "%s %d %c" , pName, &nAge, &chSex );
printf( "%s, %d, %c \n", pName, nAge,chSex );
}
free(pName);
fclose(file );
return 0;
}
※ 总结: 前面几种文件操作的使用方式对比
文件操作 | fgetc | fputc | fgets | fputs | fprintf | fscanf |
步
骤 | 定义一个变量 定义const文件指针 以”r”方式打开 (FILE *file) 判断是否空指针 死循环读字符 判断EOF 关闭文件 | 定义一个变量 定义const文件指针 以”w”方式打开(FILE *file) 判断是否空指针 用死循环接收键盘输入(getch) 接受ESC键结束和’\r’输出’\n’ fputc写入文件 关闭文件 | 定义动态数组指针 定义const文件指针 以”r”方式打开 判断是否空指针 死循环 memset指针数组 fgets把文件读取到数组指针 打印数组指针 释放数组指针内存 关闭文件 | 定义结构和定义动态数组指针 定义const文件指针 FILE *file置为空 动态初始化结构指针(根据要求个数) for循环接收输入 以”w”方式打开文件 判断是否空指针 for循环保存到文件(fputs) 释放数组指针内存 关闭文件 | 定义变量或动态数组 定义const文件指针 FILE *file置为空 以”w”方式打开文件 判断是否空指针 按格式调用fprintf 释放内存 关闭文件 | 定义变量或动态数组 定义const文件指针 FILE *file置为空 以”w”方式打开文件 判断是否空指针 按格式调用fscanf 释放内存 关闭文件 |
(4). sprintf 和sscanf
①. sprintf: sprintf(buf, “>>> %s<<<” , a);
<==>strcpy(buf, “>>>”);
strcat(but, a);
strcat(but, “<<<”);
②. sscanf:
(5). fread和fwrite:
①. fread: 用来读一组数据(缓冲区, 数据区大小, 数据块块数, 文件指针).
函数原形: int fread(void*buffer, size_t size, size_t num, FILE *stream); 如:
fread( a, sizeof(int), 10, file);
②. fwrite: 用来写一组数据(缓冲区, 数据区大小, 数据块块数, 文件指针), 如一个数组元素, 一个结构变量的值.
函数原形: int fwrite(void*ptr, int size, intnitems, FILE *stream);
fwrite( a, sizeof(int),10, file);
举例:
struct stPerson
{
char m_szName[100];
int m_nAge=0;
char m_chSex;
};
struct stPerson *Wang=(structstPerson*)malloc(sizeof(struct stPerson));
fwrite( Wang, sizeof(structstPerson), 1, file);
※ 如果未知要打开或写入的文件的类型的话:
fwrite( a, seziof(char), sizeof (a), file);
(6). fseek和ftell:
①. fseek:
a. fseek(file 100, SEEK_SET); // 从文件开头看起.
b. fseek(file 100, SEEK_ CUR); // 从文件当前位置(指针指向)看起.
c. fseek(file 100, SEEK_SET); // 从文件结尾看起.
②. ftell: ftell(字符串指针);
功能: 统计长度.
fseek(file, 0, SEEK_END);
intnRt=ftell(file); // 意义:快速定位, 统计文件长度.
(7). feof(文件指针):
文件结束检测函数
if(! feof(file) )
{
…;
}