文件及其读写操作
1.文件:文件分为磁盘文件和设备文件
①磁盘文件:指一组相关数据的有序集合,通常存储在外部介质(比如磁盘)上,使用时才调入内存
②设备文件:在操作系统中把每一个与主机相连的输入、输出设备看作是一个文件,把它们的输入、输出等同于对磁盘文件的读和写,驱动硬件
(注意:磁盘文件分为文本文件和二进制文件)
文本文件:基于字符编码的文件,常见编码有ASCII、UNICODE等
二进制文件:基于值编码的文件
2.文件的打开和关闭
①文件指针:在C语言中用一个指针变量指向一个we年,这个指针称为文件指针
②EILE是系统使用typedef定义出来的有关文件信息的一种结构体类型,结构中含有文件名、文件状态和文件当前位置等信息。其结构内容如图
③文件打开和关闭
~文件打开:
FILE* fopen(const char* filename,const char* mode)
功能:打开文件
参数:filename:需要打开的文件名,根据需要添加路径
mode:打开文件的模式设置
返回值:成功:文件指针
失败:NULL
~文件关闭
int fclose(FILE* stream)
功能:关闭先前fopen打开的文件,此动作让缓冲区的数据写入文件中,并释放系统所提供的文件资源
参数:stream:文件指针
返回值:成功:0
失败:-1
示例:
int main()
{
FILE* fp = fopen_s("F:/a.txt", "r");
if (fp == NULL)
{
printf("打开文件失败\n");
return -1;
}
printf("打开文件成功\n");
fclose_s(fp);
return 0;
}
3.文件顺序读写
~文件顺序读取
int fget(FILE* stream)
功能:从stream指定文件中读取一个字符
参数:stream:文件指针
返回值:成功:返回取到的字符
失败:-1
示例:
int main()
{
FILE* fp = fopen_s("F:/a.txt", "r");
if (!fp)
return -1;
char ch;
while ((ch = fgetc(fp)) != EOF)
{
printf("%c", ch);
}
fclose_s(fp);
return 0;
}
~文件顺序写入
int fputc(int ch,FILE* stream)
功能:将ch转换为unsigned char后写入stream指定文件中
参数:ch:需要写入文件的字符
stream:文件指针
返回值:成功:成功写入文件的字符
失败:返回-1
示例:
int main()
{
FILE* fp = fopen_s("F:/a.txt", "r");
if (!fp)
{
printf("打开文件失败\n");
return -1;
}
char ch;
while (1)
{
scanf("%c", &ch);
if (ch == '@')
break;
fputc(ch, fp);
}
fclose_s(fp);
return 0;
}
4.文件行的读写
~文件行的读取
char* fgets(char* str,int size,FILE* stream);
功能:从stream指定的文件馁读入字符,保存到str所指定的内存空间,直到出现换行字符、读文件结尾或是已读size-1个字符为止,最后会自动加上字符‘\0’作为字符串结束
参数:str:字符串·
size:指定最大读取字符串的长度(size-1)
stream:文件指针
返回值:成功:成功读取的字符串
失败(读到文件尾或出错):NULL
示例:
int main()
{
FILE* fp = fopen("F:/a.txt", "r");
if (!fp)
return -1;
char* p = (char*)malloc(sizeof(char)*100);
while (!feof(fp))
{
menset(p, 0, 100);
fgets(p, 100, fp);
printf("%s", p);
}
free(p);
fclose(fp);
return 0;
}
~文件行的写入
char* fputs(const char* str,FILE* stream);
功能:将str所指定的字符串写入到stream指定文件中,字符串结束符‘\0’不写入文件
参数:str:字符串
stream:文件指针
返回值:成功:0
失败:-1
示例:
int main()
{
FILE* fp = fopen("F:/a.txt", "r");
if (!fp)
return -1;
char* p = (char*)malloc(sizeof(char)*100);
while (!feof(fp))
{
menset(p, 0, 100);
fgets(p, 100, fp);
printf("%s", p);
}
free(p);
fclose(fp);
return 0;
}
补充:
int feof(FILE* stream)
功能:检测是否读取到了文件结尾。(注意:判断的是最后一次“读操作的内容”,不是当前位置内容)
参数:stream:文件指针
返回值:非0值:已经到文件结尾
0:还未到文件结尾
5.文件格式化读写
~文件格式化读取
int fscanf(FILE* stream,const char* format,...);
功能:从stream指定的文件读取字符串,并且根据参数format字符串来转换格式化数据
参数:stream:已经打开的文件
format:字符串格式,用法和scanf()一样
返回值:成功:参数数目,成功转换的值得个数
失败:-1
示例:
int main()
{
FILE* fp = fopen("F:/a.txt", "r");
if (!fp)
return -1;
char* p = (char*)malloc(sizeof(char) * 1024);
int a;
fscanf(fp, "%d", &a);
printf("%s", p);
fscanf(fp, "%d", &a);
printf("%s", p);
fscanf(fp, "%d", &a);
printf("%s", p);
free(p);
fclose(fp);
return 0;
}
~文件格式化写入
intf printf(FILE* stream,const char* format,...);
功能:根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定文件中,指定出现字符串结束字符‘\0’为止
参数:steam:已经打开的文件
format:字符串格式,用法和printf()一样
返回值:成功:实际写入文件的字符个数
失败:-1
示例:
int main(void)
{
FILE* fp = fopen("F:/a.txt", "r");
if (!fp)
return -1;
char ch[] = "hello world";
fprintf(fp, "%s", ch);
fclose(fp);
}
6.块文件读写
~块文件读取
size_t fread(const void* ptr,size_t size,size_ nmemb,FILE* stream);
示例:
int main()
{
FILE* fp = fopen("F:/a.txt", "r");
if (!fp)
return -1;
int value;
fread(&value, sizeof(int), 1, fp);
printf("%d\n", value);
fclose(fp);
return 0;
}
~块文件写入
size_t fwrite(const void* ptr,size_t size,size_ nmemb,FILE* stream);
功能:以数据块方式给文件写入内容
参数:ptr:准备写入文件数据的地址
size:size_t为unsigned int 类型,此参数指定写入文件内容的块数据大小
nmemb:写入文件的块数,写入文件数据总大小为:size* nmemb
stream:已经打开的文件指针
返回值:成功:实际成功写入文件数据的块数目,此值和nmemb相等
失败:0
示例:
int main()
{
FILE* fp = fopen("F:/a.txt", "r");
if (!fp)
return -1;
int a = 5678;
fwrite(&a, sizeof(int), 1, fp);
fclose(fp);
return 0;
}
7.获取文件状态
int stat(const char* path,struct stat* buf)
功能:获取文件状态信息
参数:path:文件名
buf:保存文件信息的结构体
返回值:
成功:0
失败:1
stat的结构体内容如图:
示例:
#include"sys/types.h"
#include"sys/stat.h" //这两个头文件用于调用stat
int main()
{
struct stat st;
stat("D:/copy.exe", &st);
printf("文件大小:%d\n", st.st_size)
system("pause");
return 0;
}
文章转载至
http://blog.bools.cn/archives/477