// ConsoleApplicationCReaDFile.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
//#include "cstdio"
#include "cstring";
//-- Error 3 error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details
#pragma warning(disable:4996);
//-- 一行一行读取配置文件
void readFile(){
FILE *fp = nullptr;
if (0)
{
//"r" 文件不存在不会创建文件
FILE * fp = fopen("config.txt", "r");
}
else{
fopen_s(&fp, "config.txt", "r");
}
if (!fp)
{
printf("文件打开失败!");
}
else {
printf("文件打开成功!");
//-- 足够一行的长度
char LineBuf[1248];
//-- 当前指针是否在文件末尾
while (!feof(fp))
{
//-- 读文件中的一行
if (fgets(LineBuf, sizeof(LineBuf), fp) == NULL)
{
continue;
}
//-- 防止出现在行内的'\0',
if (LineBuf[0] == '\0')
{
continue;
}
lblprocsttring:
if (strlen(LineBuf) > 0)
{
//-- 如果行尾是换行,或者回车都截取掉
if (LineBuf[strlen(LineBuf) - 1] == 10 || LineBuf[strlen(LineBuf) - 1] == 13)
{
//-- 把这个设置成字符串的结束标记
LineBuf[strlen(LineBuf) - 1] = 0;
goto lblprocsttring;
}
}
//-- 如果出现一个空行
if (strlen(LineBuf) <= 0)
{
continue;
}
printf("%s\n",LineBuf);
}
}
fclose(fp);
/*
在config.txt文件内写入以下,会打印出
http://play.goole.com
http://play.gooletest.com|1d5ds45f56c156as4d56c41ds5|9.14M
*/
}
//#pragma pack(1) //按照1字节对齐
struct stu
{
char name[30];
int age;
double score;
};
//#pragma pack() //恢复默认的字节对齐方式
//-- 将结构体写入二进制文件
void writeStructToBitFile(){
//-- 构建二个结构体,并写入数据
stu s[2];
s[0].age = 11;
s[0].score = 68.3;
strcpy(s[0].name, "哈zhangsan");
s[1].age = 11;
s[1].score = 68.3;
strcpy(s[1].name, "和lisan");
//-- 文件不存在会创建文件
FILE * fp = fopen("strcutfile.bin", "wb");
if (fp == NULL){
printf("文件打开失败!");
}
else
{
//-- 文件打开成功,向文件内写入数据
int structLen = fwrite(&s, sizeof(stu), 2, fp);
//-- 参数1: 要写入文件中的数据 的地址
//-- 参数2:要写入文件的字节数
//-- count: 要写入多少个size字节的数据项
//-- fp:文件指针,由fopen返回
//-- 返回值,写入失败返回0,否则就返回第三个参数
printf("写入%d个size(s)=%d字节的字节数", structLen, sizeof(stu));
//在window下vs编译器 编译输出: 写入2个size(s)=48字节的字节数
/*
1.保存到文件中的结构体,结构体成员不要出现指针类型成员(地址就每次运行会变,取出保存的地址 再用无效error)
2.结构体成员字节对齐: vs编译器编译会调整成8的整数倍 gcc编译器调整成4的整数倍。 如果要跨系统读取保存的文件,应该使用;#pragma pack(1)设置结构体的对齐方式
*/
fclose(fp);
}
//printf("写入%d在块变量外", structLen);
}
//-- 从二进制文件中读出结构体数据
void readStructDataFromBitFile(){
stu s[2];
FILE * fp = fopen("strcutfile.bin", "rb");
if (fp != NULL)
{
fread(s, sizeof(stu), 2, fp);
fclose(fp);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
//readFile();
//writeStructToBitFile();
readStructDataFromBitFile();
return 0;
}
C 读取配置文件/将结构体写入二进制文件/从二进制文件中读出结构体数据
最新推荐文章于 2024-03-01 21:53:31 发布