您的位置:首页 > 编程语言 > C语言/C++

c++将struct中的内容写入txt文件的方法(含嵌套struct情况)

2017-03-14 13:01 633 查看
C++语言继承了C语言的struct,并且加以扩充。在C语言中struct只能定义数据成员,而不能定义成员函数。而在C++中,struct类似于class,在其中既可以定义数据成员,又可以定义成员函数。结构类型是用户定义的复合类型,它可由不同类型的字段或成员构成。在C++中,struct与class基本是通用的,唯一不同的是如果使用class关键字,类中定义的成员变量或成员函数默认都是private属性的,而采用struct关键字,结构体中定义的成员变量或成员函数默认都是public属性的。。
在C中,必须显示使用struct关键字来声明结构。在C++中,不需要在定义该类型之后使用struct关键字。可以选择在定义结构类型时,通过在右大括号和分号之间放置一个或多个逗号分隔的变量名称来声明变量。可以初始化结构变量,每个变量的初始化必须括在大括号中。
struct是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如array、struct、union等)的数据单元。对于结构体,编译器会自动进行成员变量的对齐,以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对界(natural alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。

  自然对界(natural alignment)即默认对齐方式,是指按结构体的成员中size最大的成员对齐,例如:

struct naturalalign
{
char a; //char size=1
short b; //short size=2
int c;  //int size=4
};
在上述结构体中,size最大的是int,其长度为4字节,因而结构体中的char成员a、short成员b都以4为单位对齐,sizeof(naturalalign)的结果等于12;举个简单的结构体使用实例:

#include <iostream>
#include <string>
using namespace std;

struct Movie/*可以指定类型名也可以不指定*/
{
int ID;
string Name;
} movie; //可以在声明struct的时候声明一个struct实例

int main()
{
//movie变量已经在Movie结构声明处定义
movie.ID = 001;
movie.Name = "Face Off";

cout << "movie.ID = " << movie.ID << endl;
cout << "movie.Name = " << movie.Name << endl;

//定义一个结构体变量m
Movie m;
m.ID = 002;
m.Name = "Hero";
cout << "m.ID=" << m.ID << endl;
cout << "m.Name=" << m.Name << endl;

//定义结构的指针
Movie * mp;
mp = &m;
//在指针中调用成员时要用->符号,mp->ID等价于(*mp).ID
cout << "mp->ID = " << mp->ID << endl;
cout << "mp->Name = " << mp->Name << endl;

}


运行结果如下:



示例一种struct内嵌套struct,或者嵌套的struct再嵌套struct的情况,并将struct中的数据写到txt文件中。
首先,定义需要的结构体:
typedef struct _edgefile{
char name[edgeName];
uint32_t width;
}EdgeContents;
typedef struct _edgeinfo{         
         double*pY;                                                   
} EdgeInfo;
typedef struct _Package_edge
{
EdgeInfo edge_info;
uint32_t count;
} PackageEdge;

typedef struct _Image_Package_Edge
{
char name[edgeName];
uint32_t iHgh;
PackageEdge *pStrEdge;
}Package;后面用到动态调用dll文件的方法,请参见:http://blog.csdn.net/piaoxuezhong/article/details/61201785。在调用EdgeContents结构中name值时的方法为:(*p).pStrEdge->edge_file_info.name,调用PackageEdge结构中的count值时的方法为:(*p).pStrEdge->count 
int main()
{
const char* dllName = "xxx.dll";
const char* funName = "xx";

HINSTANCE hDLL = LoadLibrary(dllName);//加载dll,将dll放在该工程根路径即可

if (hDLL != NULL)
{
ReadPackage fp = ReadPackage(GetProcAddress(hDLL, "xx"));//获取导入到应用程序中的函数指针,根据方法名取得

if (fp != NULL)
{
cout << "run the function:";
char * filename = "D:\\..\\..";
Package *p=(Package*)fp(filename);
cout << (*p).pStrEdge->edge_file_info.fname << endl;
/*写.txt文件*/
ofstream out("F://IM_VIDEO//out.txt");
if (out.is_open())
{
out << (*p).name << "  "<< (*p).iHgh<<(*p).pStrEdge->count
<< "  " << (*p).pStrEdge->edge_file_info.fname<< endl;
out.close();
}
return 0;

}
else
{
cout << "Cannot Find Function : " << funName << endl;
}
FreeLibrary(hDLL);
}
else
{
cout << "Cannot Find dll : " << dllName3 << endl;
}
return 1;
}

显示EdgeInfo的pY信息:

for (int j = 0; j < M; j++) //M可以是图片数量
{
for (int i = 0; i < N; i++) //N是每个图的pY数量
{
out_pOrig << (((*pPackage).pStrEdge +j)->edgeinfo ->pY) [i] << " ";
}
}

参考:
https://segmentfault.com/q/1010000007544190?_ea=1381609 http://www.cnblogs.com/wanqieddy/p/3186191.html http://www.cnblogs.com/yukaizhao/archive/2012/04/07/cpp_file_struct.html http://blog.csdn.net/fengbingchun/article/details/52072206
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct txt