一、文件的打开
文件在读或写之前,必须要打开,读写结束后,必须要关闭,否则会造成文件不完整或者资源泄露。
fopen:文件打开函数,调用方式:
FILE *fp; FILE是一个结构体,fp是指向FILE的指针(结构体指针)
fp=fopen(路径加文件名,使用文件的方式);l两个参数都是字符串 “”
fp=fopen("a.txt","r");//打开“a.txt”文件,打开方式为 只读
二、文件的关闭:fclose(),只有文件打开成功才需要关闭
文件打开必须要关闭,关闭文件时会触发系统把缓冲区内的文件写入内存,以防止数据丢失;
if(fp!=NULL)
{
fclose(fp);
}
三、文件的简单读写
#include<stdio.h>
#include<string.h>
int main()
{
//商业级代码
//文件读写的实战操作
FILE *fp = fopen("D:\\desktop\\Ftext.txt", "r");//win路径用双反斜杠,linux路径用正斜杠
if (!fp)//if(fp==NULL)
{
printf("文件打开失败\n");
}
else
{
//文件打开成功
char LineBuff[1024];//定义一个缓冲区,足以可以容纳一行文本的内容
while (!feof(fp))
{
LineBuff[0] = 0;//'\0'
//读取一行,遇到换行符结束
if (fgets(LineBuff, sizeof(LineBuff) - 1, fp) == NULL)
continue;//读取该行出现问题,跳过
if (LineBuff[0] == 0)
continue;
lblprocstring://GOTO语句
if (strlen(LineBuff) > 0)//读到了实际内容
{
if (LineBuff[strlen(LineBuff) - 1] == 10 || LineBuff[strlen(LineBuff) - 1] == 13)//遇到换行符或者回车符
{
LineBuff[strlen(LineBuff) - 1] = 0;
goto lblprocstring;
}
}
if (strlen(LineBuff) <= 0)
continue;
printf("%s\n", LineBuff);
}
}
fclose(fp);//关闭文件
getchar();
return 0;
}
注意事项:1、写入文件的结构体不能出现指针变量,没有意义
2、结构体内存对齐问题,与编译器有关,在VS上,以8个字节对齐,即结构体大小是8的整数倍,在GCC上以4字节对齐。
解决方法:
①不要跨平台
②使用#pragma pack(1) #pragma pack() 定义结构体时在前后加上这两行,结构体就会1字节对齐。
#include<stdio.h>
#include<string.h>
#pragma pack(1)//强制结构体内存1字节对齐
struct stu
{
char name[30];//30
int age;//4
double score;//8
};
#pragma pack()//
int main()
{
//将结构写入二进制文件
//fwrite() :用于文件中写入数据;一般形式
//fwrite(buffer,size,count,fp);
//buffer:地址,指针,要写到文件中的数据就在这个地址保存着
//size:要写的文件字节数
//count:要写入多少个size字节的数据项
//fp:文件指针
//返回值:如果fwrite失败返回0,否则返回count的值
struct stu student[2];
struct stu studentnew[2];
int size = 0;
strcpy(student[0].name, "张三abc");
student[0].age = 12;
student[0].score = 92.1f;
strcpy(student[1].name, "李四def");
student[1].age = 19;
student[1].score = 88.1f;
FILE *fp;
size = sizeof(struct stu);
fp = fopen("structfile.bin", "wb");
if (fp == NULL)
{
printf("文件打开失败!");
}
else
{
//文件打开成功
int result = fwrite(student, sizeof(struct stu), 2, fp);
fclose(fp);
}
//二、从二进制文件中读结构体数据:
//fread(buffer,size,count,fp),参数与fwrite一样
fp = fopen("structfile.bin", "rb");
if (fp == NULL)
{
printf("文件打开失败!");
}
else
{
//文件打开成功
int result = fread(studentnew, sizeof(struct stu), 2, fp);
fclose(fp);
}
return 0;
}