C语言文件处理

本文详细介绍了C语言中文件的打开、关闭以及读写操作。通过`fopen()`函数打开文件,`fclose()`函数关闭文件,并展示了如何处理文件读写的常见情况,包括读取文本文件的每一行。同时,提到了结构体对齐问题及其解决方案,并给出了在不同编译器下结构体对齐的示例。最后,演示了如何使用`fwrite()`和`fread()`函数进行二进制文件的结构体数据读写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、文件的打开

文件在读或写之前,必须要打开,读写结束后,必须要关闭,否则会造成文件不完整或者资源泄露。

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值