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内嵌套struct,或者嵌套的struct再嵌套struct的情况,并将struct中的数据写到txt文件中。
首先,定义需要的结构体:
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
显示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
在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
相关文章推荐
- C++往txt文本文件里面写入内容
- C++中Txt文件读取和写入(方法汇总)
- c++创建txt文件,并写入内容
- c++逐行读取写入txt文件的方法
- sql 读取txt 文件内容,并写入sql的方法
- C++将txt文件内容保存到数组的方法
- Python打开文件,将list、numpy数组内容写入txt文件中的方法
- C++引入外部txt文件内容的方法
- C++ 如何用创建txt文件,并且写入内容(汇总)
- sql 读取txt 文件内容,并写入sql的方法
- 将richTextBox中的内容写入txt文件发现不换行(解决方法),在richTextBox指定位置插入文字
- C++写入txt文件方法
- C++读取txt文件的方法
- 读取TXT文件内容的方法
- JAVA 创建TXT文件,写入文件内容,读取文件内容
- C++读取文件,将文件内容读取到struct中
- C++读取txt文件的方法
- JAVA 创建TXT文件,写入文件内容,读取文件内容
- 读取TXT文件内容的方法
- java实现持续写入内容到txt文件