文件操作
文件打开:fopen()
FILE * fopen(const char* _Filename, const char* _Mode);
参数: _Filename:需要打开的文件名,字符串
_Mode:文件打开模式.字符串
"r" ---文件打开只可以读取,不可以写入.(如果文件不存在则打开失败)
"w" ----文件只可以写入,不可以读取.文件如果不存在就创建.内容都会清空
"r+"----文件可读可写的方式打开.不存在则失败
"w+"----文件可读可写的方式打开.不存在则创建且会清空.
"rb"----二进制方式读取文件
"wb"----二进制方式写入文件.
"a"-----追加方式打开,对文件进行写入操作.一开始光标在最后面.如果文件不存在则创建.
返回值: 文件指针,只是一个文件的标志.如果失败返回NULL
文件写入:
fputc---写入一个字符到文件.(内存->硬盘)
int fputc(int _Ch, FILE * _File);
参数:ch需要写入文件的字符ascii
file是文件指针.
返回值:如果成功返回写入的字符.
如果失败返回EOF. error of file
文件读取:
fgetc()----从文件中获取一个字符.
int fgetc(FILE * _File);
参数: 文件指针
返回值:int是字符的ascii码.char接受.是从文件中读取到的内容.
文件关闭 fclose();
int fclose(FILE * _File);
文件关闭 fclose();
int fclose(FILE * _File);
其他操作
fgetc();—读文件
fputc();—写文件
文件读写.(把不同数据类型的内容转换成字符串写入文件中)
fscanf()-----读取文件
int fscanf(FILE * _File, char * _Format, …);
参数:_File 文件指针
_Format:格式化字符串,变长参数必须加取地址符号.
fprintf()----写入文件
int fprintf(FILE * _File,const char * _Format, …);
参数:_File 文件指针
_Format:格式化字符串,把不同的数据类型组建成字符串写入到文件中
//不同数据类型内容读写入文件代码
#include <stdio.h>
#include <string.h>
int main()
{
FILE* pF1 = fopen("danny.txt", "w+"); //打开文件
if (!pF1)
{
printf("打开文件失败\n");
return 0;
}
//写入文件
char name[12] = "danny";
int age = 17;
double length = 16.5;
fprintf(pF1, "%s %d %lf", name, age, length); //执行写入操作
fclose(pF1);
//name[12] = { 0 };
strcpy(name, "");
age = 0;
length = 0;
//如果打开成功继续
if (pF1=fopen("danny.txt", "r+"))
{
fscanf(pF1, "%s %d %lf", name, &age, &length);//执行读取操作
}
printf("名字:%s,年龄:%d,长度:%lf\n", name, age, length);
fclose(pF1);
return 0;
}
不同的数据类型读写入文件
文件读写:
fread();—读文件
size_t fread(void* _DstBuf, size_t _ElementSize, size_t _Count,FILE * _File);
参数:_DstBuf,某一个变量的地址,需要读入到文件的缓冲.(一块内存空间)
_ElementSize:一次读取文件的大小. int x = 10;
_Count:读取文件的次数.
_File:文件指针.
返回值:实际读取文件的次数
fwrite();–写文件()
size_t fwrite(const void* _Str, size_t _Size, size_t _Count, FILE * _File);
参数:_Str:需要写入文件的指针.
_Size:一次写入文件大小
_Count:写入文件的次数
_File:文件指针.
返回值:实际写入文件的次数
//不同的数据类型读写入文件代码
#include <stdio.h>
typedef struct student
{
int age;
char name[20];
}Stu;
//把一个学员的信息写入文件,然后读取后打印出来.
int main()
{
Stu xxx = { 17, "danny" };
FILE * pFile = NULL;
if (pFile = fopen("danny.av", "w+"))
{
int x = fwrite( &xxx,sizeof(Stu),1,pFile); //结构体类型写入文件
printf("x = %d\n", x);//
}
//fclose(pFile);
rewind(pFile);
Stu ooo = { 0,"" };
//if (pFile = fopen("danny.av", "r+"))
fread(&ooo, sizeof(Stu), 1, pFile); //从文件中读取结构体类型的数据
printf("姓名是:%s,年龄是%d\n", ooo.name, ooo.age);
fclose(pFile);
return 0;
}
文件的读写
fgets();---读文件
char *fgets(char * _Buf,int _MaxCount, FILE * _File);
参数:_Buf需要写入文件的字符串
_MaxCount:读取字符的最大个数
_File:文件指针.
返回值: 如果成功返回_Buf的字符串首地址
//如果失败返回EOF.文件错误
失败返回NULL.
fputs();---写文件
int fputs(const char * _Str, FILE * _File);
参数:_Str写入到文件的字符串.
_File:文件指针.
返回值成功返回非负整数失败返回EOF.(-1)
文件偏移
文件偏移:(相当于文件中光标的移动)
ftell();–返回文件中光标的位置,返回文件偏移位置.
long ftell(FILE * _File);
fseek()—把文件中光标移动到指定的位置(移动文件偏移到指定位置)
int fseek(FILE * _File, long _Offset,int _Origin);
参数: _File文件指针
_Offset:偏移的位置
_Origin:偏移的起始位置.
SEEK_CUR 1 当前位置
SEEK_END 2 文件末尾
SEEK_SET 0 文件开头
void rewind(Inout FILE * _File);—把光标移动到文件开始位置
//文件偏移操作代码
#include <stdio.h>
int main4()
{
FILE* pFile = NULL; //ini格式需要自行学习
if (pFile = fopen("liguangbiao.ini", "r+"))
{
fseek(pFile, 0, SEEK_END); //尾部偏移
printf("文件偏移 %d", ftell(pFile));
}
rewind(pFile);
fclose(pFile);
return 0;
}
文件关闭
fclose()
实现文件拷贝功能代码
#include <stdio.h>
#include <string.h>
//文件拷贝功能.
int main1()
{
//读取第一个文件内容拷贝到第二个文件中.
FILE* pF1 = fopen("danny.txt", "r");
if (!pF1)
{
printf("打开文件失败\n");
return 0;
}
//第二个文件,把第一个文件内容拷贝到第二个文件中.
FILE* pF2 = fopen("xiaqi.txt", "w");
while (1)//caadef\0
{
//char buf[10] = { 0 };
//fputs(fgets(buf, 9, pF1), pF2);
char buf[10] = { 0 };
if (NULL != fgets(buf, 9, pF1))
{
fputs(buf, pF2);
}
else
{
break;
}
}
fclose(pF1);
fclose(pF2);
return 0;
}
文件操作演示代码
#include <stdio.h>
//
int main()
{
FILE* pFile = fopen("danny.av","r+");
if (!pFile)
{
printf("文件打开失败\n");
return 0;
}
//
char xx = fgetc(pFile);
printf("xx = %c\n", xx);
xx = fgetc(pFile);
printf("xx = %c\n", xx);
fclose(pFile);
pFile = fopen("danny.av", "r+");
fputc(65, pFile);
//关闭并保存
fclose(pFile);
return 0;
}
其他演示
对文件进行加密操作,例,如果文件中有abcd这样的字符,把文件内容读取之后,对字符按照如下
//方式进行加密:a + 1,b + 2,c + 3,d + 4 变成bdgh 后重新写入文件
#include <stdio.h>
#include <stdlib.h>
int main()
{
//首先需要打开文件
FILE* pFile = fopen("danny.txt", "r+");
if (NULL == pFile)
{
printf("文件打开失败!\n");
}
//读取文件内容
char ch = 0; //ch得到文件中的字符
char ch1 = 0; //ch1得到文件中的字符
int count = 0;
for (int i = 0; ch != EOF; i++)
{
ch = fgetc(pFile);
printf("%c", ch);
count ++;
}
printf("\n");
printf("有%d个字符!\n", count);
fclose(pFile);
pFile = fopen("danny.txt", "r+");
if (NULL == pFile)
{
printf("文件打开失败!\n");
}
char* change = (char*)malloc(sizeof(char)*count);//动态申请数组的大小
//对文件中的内容进行写入操作 在原有的内容中依次加上一个值
for (int n = 0; n < count; n++)
{
ch1 = fgetc(pFile);//再次得到文件中的字符
ch1 += n + 1; //对文件中的字符依次加n
change[n] = ch1; //将得到的字符存入数组change中
printf("%c", change[n]);
}
fclose(pFile);//先关闭文件
pFile = fopen("danny.txt", "w");//再次打开文件并清空文件的内容
for (int i = 0; i < count; i++)
{
fputc(change[i], pFile);将数组change中的值存入danny.txt中
}
//操作完成,文件需要关闭
fclose(pFile);
free(change);//释放申请的内存
return 0;
}