精华内容
下载资源
问答
  • 写入结构体内容到文件 #include <bits/stdc++.h> using namespace std ; // COO typedef struct { int r , c ; char s[100] ; }Triple ; typedef struct { Triple data[100] ; // 大小100 int mn , nm ...

    A文件 - > 写入结构体内容到文件

    #include <bits/stdc++.h>
    using namespace std ;
    // COO
    typedef struct {
    	int r , c ;
    	char s[100] ; 
    }Triple ;
    
    typedef struct {
    	Triple data[100] ; // 大小100
    	int mn , nm , tu ; 	
    }TriSprMatrix ;
    
    TriSprMatrix a ;
    Triple b ;
    int main(){
    
    	FILE* fp1 = fopen("./test_bin.bin","w") ;
    	int cnt = 0 ;
    	while (cin >> b.r >> b.c >> b.s) {
    		if( b.r == -1 ) break ; 
    		a.data[cnt] = b ;
    		cnt ++ ; 
    		// outFile.write((char*)&b, sizeof(b)) ;
    	}
    	a.mn = 3 ; 
    	a.nm = 3 ;
    	a.tu = cnt ;
    	
    	fwrite(&a , sizeof(a) , 1 , fp1 ) ;
    
    	return 0;
    }
    

    B文件 - > 读取文件内容到结构体

    #include <bits/stdc++.h>
    using namespace std ;
    // COO
    typedef struct {
    	int r , c ;
    	char s[100] ; 
    }Triple ;
    
    typedef struct {
    	Triple data[100] ; // 大小若改为1000,则读写失败
    	int mn , nm , tu ; 	
    }TriSprMatrix ;
    
    	TriSprMatrix a ;
    	Triple b ;
    int main(){
    	FILE* fp2 = fopen("./test_bin.bin","r") ;
    	fread(&a , sizeof(a) , 1 , fp2) ;
    	cout << a.tu << endl ;
    	for( int i = 0 ; i < a.tu ; i++ ) {
    		cout << a.data[i].r << ' ' << a.data[i].c << ' ' << a.data[i].s << endl ;
    	}
    	return 0;
    }
    

    若对结构体进行文件读取,必须保证两者等价,不一致则会导致失败。 本来是很显然的道理,但是写的时候却没有注意,故做此记录。

    展开全文
  • C语言结构体对齐

    2020-11-19 19:09:34
    我用二进制读取软件读取这个文件处理出来的结果对比发现:处理出来的数据竟然跳过一个4字节,也就是说,我处理出来的数据里面没有原始二进制文件中的对应的那4个字节。 师兄又来了,print一下结构体的大小,发现...

    C语言结构体对齐

    今天又解码一个二进制文件,又遇到了问题,事情是这样的:读取一个字段,我用一个结构体来接收这些数,然后逐个处理,但结果却不对。我用二进制读取软件读取这个文件,与处理出来的结果对比发现:处理出来的数据竟然跳过一个4字节,也就是说,我处理出来的数据里面没有原始二进制文件中的对应的那4个字节。

    师兄又来了,print一下结构体的大小,发现是40个字节,而我取的是36字节。多出来的4字节是哪里来的呢,这个时候师兄突然想到了结构体对齐这个东西。

    先上一段我自己的代码:

    struct C_TABLE
    {
    	unsigned int time_tag;
    	int item2_3;
    	int item4;
    	int item5;
    	unsigned int item6_14;
    	int item15_19[2];
    	long long item20_22;
    };
    

    逐个取,总共36字节,按理是没错的啊,但是结构体有一个对齐的东西需要注意。对齐的原因就是为了提高存取的效率。

    如果将结构体比喻成一个长方形容器(容器的宽度为结构体中数据类型大小最大的值),我们往里放数据(也是长方形):
    在这里插入图片描述接下来要放8字节的数的时候,这样放是不行的:
    在这里插入图片描述只能这样放:
    在这里插入图片描述那中间空着的是干嘛了呢?答案是自动存取了4字节的数据,导致多取了4字节的数据。
    对齐很关键,需要留意。

    举几个例子结束:

    struct aa
    {
    	char a3;
    	int a1;
    	unsigned int a2;
    };
    

    这个结构体的大小是12字节。

    struct aa
    {
    	int a1;
    	unsigned int a2;
    	long long a3;
    };
    

    这个结构体的大小是8字节。

    展开全文
  • /**********************************************************************...* 文件名称:stu.c * 文件标识:无 * 内容摘要:演示程序 * 其它说明:主要学习三点知识: 1.建立一个结构体,类型名为student ...
    /**********************************************************************
    * 版权所有 (C)2017, Wang maochun。
    *
    * 文件名称:stu.c
    * 文件标识:无
    * 内容摘要:演示程序
    * 其它说明:主要学习三点知识:
                1.建立一个结构体,类型名为student
                2.当定义结构体变量时,通过成员操作符访问成员(.)
                  当定义指向结构体的指针时,通过间接访问操作符(->) 
                3.传值操作,子函数对实参进行了一份拷贝,对其的操作不会影响到orginal value,我们通过打印地址和实参不同可以看到
                  传址操作,子函数传递了实参地址,此时操作的是orginal value,优点是节省空间和花销。如果子函数不修改需const修饰 
    * 当前版本:V1.0
    * 作    者:Wang maochun
    * 完成日期:2017.7.23 
    *
    **********************************************************************/
    
    #include <stdio.h>
    struct student{
        int code;
        char name[10];
        char sex[10];
        int age;
    };
    void printStuInfobyValue(student stu)
    {
        printf("in fun结构体传值:学号、姓名、性别、年龄:\n");
        printf("%5d [%p]\n %5s [%p]\n %5s [%p]\n %5d [%p]\n\n",stu.code,&stu.code,stu.name,&stu.name,
                                                               stu.sex,&stu.sex,stu.age,&stu.age);
    }
    
    void printStuInfoByAdress(student* pstu)
    {
        printf("in fun结构体传地址:学号、姓名、性别、年龄:\n");
        printf("%6d [%p]\n %6s [%p]\n %6s [%p]\n %6d [%p]\n\n",pstu->code,&pstu->code,pstu->name,&pstu->name,
                                                               pstu->sex,&pstu->sex,pstu->age,&pstu->age);
    }
    
    int main(){
        //struct student stu;
        student stu      = {123,"wsq","Male",23};
        student *pstu = &stu;
        printf("in main:学号、姓名、性别、年龄:\n");
        //scanf("%d %s %s %d",&stu.code,stu.name,stu.sex,&stu.age);
        printf("%5d [%p]\n %5s [%p]\n %5s [%p]\n %5d [%p]\n\n",stu.code,&stu.code,stu.name,&stu.name,
                                                               stu.sex,&stu.sex,stu.age,&stu.age);
        printf("%6d [%p]\n %6s [%p]\n %6s [%p]\n %6d [%p]\n\n",pstu->code,&pstu->code,pstu->name,&pstu->name,
                                                               pstu->sex,&pstu->sex,pstu->age,&pstu->age);
                                                               
        printStuInfobyValue(stu);   //结构体传值
        printStuInfoByAdress(&stu); //结构体传地址 
        return 0;
    }

    运行效果:

     我们可以看到:

     结构体对象作为参数时,编译器对其进行了copy,(我们通过传入的地址和main中不同可以发现)。此时在函数中的操作都是对其拷贝的操作,不影响main函数中的origin value

       缺点是,当结构体变量非常大时,编译器对其进行复制,开销较大。

    用结构体变量作实参时,采取的是"值传递"的方式,将结构体变量所占的内存单元的内容全部顺序传递给形参.形参也必须是同类型的结构体变量.在函数调用期间形参也要占用内存单元.
    
    这种传递方式在空间和时间上开销较大,如果结构体的规模很大时,开销是很可观的.

    结构体地址作为参数时,子函数中操作和main函数操作的是同一个结构体,此时传递的参数时一个地址。

              优点是不需要进行copy,但是使用时要小心,如果不想修改其值,需用const关键字修饰

    转载于:https://www.cnblogs.com/shuqingstudy/p/7226257.html

    展开全文
  • 我写的代码如下:(是使用vc++编译的,最后结果有一些实际答案不同) #include #include #include #define N 1000 void main() { int zi_mu(char *sp); int statistics(char b[80][80],...
  • C语言——结构体

    千次阅读 2016-03-03 08:52:12
    C语言——结构体 宗旨:技术的学习是有限的,分享的精神的无限的。 1、结构体的作用:个人理解,结构体就是把一堆相关的数据打包成一个结构,使其...如果此结构体只在本文件中使用,则放在源文件中(.c文件中),

    C语言——结构体


    宗旨:技术的学习是有限的,分享的精神是无限的。


    1、结构体的作用:个人理解,结构体就是把一堆相关的数据打包成一个结构,使其放在一块内存区域。——项目之中尽量使用结构体,而不要单独使用数组。

     

    2、结构体的声明与定义

    规范:

    1)如果此结构体在多个文件中使用就放在头文件中(.h文件中);如果此结构体只在本文件中使用,则放在源文件中(.c文件中),并加以static限定。

    2)如果是用typedef起别名,则以_t作为后缀;如果是用static限定的则不用_t后缀。

    typedef __packed struct
    {
      uint8_t datetime[6];    // 年月日,时分秒 (BCD) -- 连续驾驶开始/结束时间
      int16_t altitude;  // 海拔
      int32_t longitude; // 经度
      int32_t latitude;  // 纬度
    } gbt19056_fatigue_info_t;// __packed表示一字节对齐,单片机编程中常用
    // gbt19056_fatigue_info_t相当于类型名,类似于int,float之类的
    
    static struct
    {
      rtc_timer_t timer_check;
      uint16_t attr; // 区域属性
      ca8gps_event_data_t event;
    } t808_area;
    

    结构体声明的时候一定要注意字节对齐的问题,加上__packed为了一字节对齐,否则默认是4字节对齐的。

    定义和声明:定义分配内存,声明不分配内存。

     

    3、结构体的初始化接口

    规范:函数名大写的是对外接口,函数名全小写加下划线的是对内接口。

    typedef重命名的要先定义一个变量,然后再使用,如下:

    gbt19056_fatigue_info_t info1; // 访问则是info1.altitude = 0x012;

    gbt19056_fatigue_info_t *info2; // 访问则是info2->altitude = 0x012;

    static限定的则直接使用,t808_area. attr = 0x55;

    一般项目中要写初始化函数:

    void gbt19056_fatigue_init(void)
    {
      memset(&info, 0, sizeof(gbt19056_fatigue_info_t));
    
      memcpy(info2->datetime, date, sizeof(info2->datetime));
      info2->altitude = 0;
      info2->longitude = 0x7FFFFFFF;
      info2->latitude = 0x7FFFFFFF;
    }


    4、结构体访问接口

    比较大型一点的项目之中,多个文件会用到一些结构中的成员,因此写成接口形式。

    规范:一般少使用全局变量,需要某些值的时候以函数接口形式给予。

    uint16_t T808AreaAddr(void)
    {
      return t808_area. attr;
    }
    
    void GBT19056FatigueTime(char *data)
    {
      memcpy(data, info2->datetime, sizeof(info2->datetime));
    }


    5、结构体中一些技巧

    处理批量类似事情:

    // 一个命令字对应一个处理函数,用for循环扫描
    // 命令字有的用枚举, 有的用宏
    typedef enum
    {
      T808_CUSTOM_CAMERA_COUNT      = 1,
      T808_CUSTOM_DISTANCE_TYPE     = 2,
      T808_CUSTOM_OIL               = 3,
      T808_CUSTOM_VERSION           = 4
    } t808_t;
    // 再三强调,起别名的类型一定要加_t后缀以示区分
    typedef uint8_t (*handler_t)(char *data, uint8_t length);
    
    typedef struct
    {
    // 变量类型和函数参数随机应变
      uint8_t cmd;
      uint8_t length;
      handler_t hander;
    } t808_custom_entry_t ;
    
    static uint8_t t808_custom_camera_count(char *data, uint8_t length);
    static uint8_t t808_custom_disdance _type(char *data, uint8_t length);
    static uint8_t t808_custom_oil(char *data, uint8_t length);
    static uint8_t t808_custom_version(char *data, uint8_t length);
    
    //===========================================================
    // 定义好结构之后,用数组装载整个命令及其处理函数
    static const  t808_custom_entry_t t808_custom_entries[] =
    {
      {T808_CUSTOM_CAMERA_COUNT, 1, t808_custom_camera_count},
      {T808_CUSTOM_DISTANCE_TYPE, 1, t808_custom_disdance _type},
      {T808_CUSTOM_OIL, 22, t808_custom_oil},
      {T808_CUSTOM_VERSION, 14, t808_custom_version},
    };
    
    // 在一个函数中用for循环扫描
    static void
    custom_setting(client_t*client, t808_hdr_t *request, uint16_t length)
    {
      t808_custom_entry_t*entry;
    
      for(entry = t808_custom_entries; entry->handler; ++entry)
      {
        if(entry->cmd == request->cmd)
        {
          entry->handler(data, length); // 只是一个轮廓,仅供参考
    
          break;
        }
      }
    }


     

    展开全文
  • 另外要记录下:struct在C++中,在a文件中定义在b文件中定义变量是可以的,但在C语言中,定义变量时要加上struct 如下: A.c struct dim{  int x;  int y ; } B.c #include"A.c" ...
  • C语言与C++结构体大小计算时区别 C语言 在嵌套的结构体中,结构体内部的作用域是全局的,即内部...以下为main.c文件结构体A的整体大小在默认对齐数为8时,大小为40,内层结构体B的大小为24,如果是只考虑内外成员变
  • C语言外部调用结构体,变量和数组

    万次阅读 2018-03-18 10:45:56
    程序设计中遇到的问题:结构体与外部调用变量和数组。【结构体定义与声明】将结构体写在子文件time.c里,并且在time.h声明外部调用,结果如图,只能在time.c文件中使用,不能实现结构体外部调用。 将结构体的声明和...
  • C语言学习宝典(5) 结构体: 将不同类型的数据组合成为一个有机的整体,这个整体就是一个结构体。 例如: Struct student { Int name; Char sex; Float score; }; 使用方法: 类型名 成员名; 一般...
  • 结构体以及文件操作(上) 本文要点: 1. 结构体结构体类型、结构体变量) 2. 结构体数组 3. 枚举:是一个被命名的整型常数的集合,第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加1 共用体...
  • C内调试程序所用的指令: gcc file(文件名) -g 表示编译需要调试的文件。 JDB 表示调试工具。 jdb a.out 表示进入需要调试的文件内部。 L 表示显示代码的内容。 b(break point) 表示调试断点。 r
  • 我们通常在完成一个程序时,往往习惯将程序写为多文件的,这样就能实现程序的模块化管理,以及分工开发合作。... 在这里,写了一些小段的测试代码,来说明:包含.c文件,,直接多文件,包含.h文件三种方...
  • 一:C语言中的对文件的操作 主要介绍以下函数: ★fopen(path,model) + fclose(FILE*fp) ★fgetc(FILE*fp) + fputc(char c,FILE*fp) ★fgets(char *a,n,FILE *fp) + fputs(char *str,FILE *fp) 1)文件的打开...
  • C语言知识体系总结

    2019-12-29 11:59:50
    C语言 编程 C语言资源 C语言文件 C语言结构体与共用体 C语言编译预处理 C语言指针 C语言数组 C程序流程设计 C语言数据的输入和输出 C语言数据描述 C语言概述 C语言函数 C语言书籍 C语言杂技
  • 尹成老师带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、...
  • 1,昨天的作业题经典C语言题型1将全局区二维字符拷贝到堆中2将栈区二维字符拷贝到堆中3合并栈区全局区的二维字符数组4把数组排序5打印堆区的二维数组6释放堆空间chunli@Linux:~/high$catmain.c #include<stdio.h...
  • C语言基础:多文件编译

    万次阅读 多人点赞 2018-03-31 07:48:32
     多文件编译,在我们最早编写Hello World程序时我们就将程序写在了一个后缀名为.c的文本文件里,然后通过gcc编译器对其编译并运行。在本节我们将学习如何编写多个源文件的程序一、头文件header源文件source ...
  • http://jingpin.jikexueyuan.com/article/38309.html 语言头文件组织包含原则 作者: clover_toeic ...发布时间:2015-07-07 16:38:58 ... 如非特殊说明,文中“源文件”指*.c文件,“头文件”指
  • 理论上来说cpp文件与头文件里的内容,只要是C语言所支持的,无论写什么都可以的,比如你在头文件中写函数体实现,任何一个cpp文件包含此头文件就可以将这个函数编译成目标文件的一部分(编译是以cpp文件为单位的,...
  • 第1部分 熟悉C语言程序编辑调试环境 第1关: 打印输出 Hello World #include<stdio.h> int main(void) { /********* Begin *********/ printf("Hello World"); /********* End *********/ return 0...
  • C语言_文件的读

    2018-11-28 21:47:32
    一.相关概念 1.文件信息区   每个要被使用的文件(比如要进行读或写操作...  知道了FILE该结构体是用来保存文件的相关信息的,那么下面来看看该c编译环境提供的stdio.h头文件中该结构体的定义代码 typedef stru...
  • 程序设计技术 C语言数据描述和C程序设计初步 结构化程序设计基础和C语言的控制结构 数组及其应用 函数与C程序结构 指针与函数 指针与数组 字符串及其应用 结构体类型和联合体类型 C语言文件处理及其应用 位运算与...
  •  在C语言中的文件结构类型FILE中介绍了文件结构体类型FILE,在fopen和fclose函数中都将用到FILE类型的参数,FILE结构体类型的成员虽然很多,但是在文件的打开和关闭操作中,并不会涉及到这些成员,只要定义一...
  • 你是否还记得c语言的这些文件操作?

    千次阅读 多人点赞 2021-06-01 23:59:08
    学完c已经较长时间了,在学习期间陆陆续续的整理了多篇关于c的详细知识点文章,此篇文章将是博主对于c整理的倒数第二篇文章----------c语言文件操作.下面博主也放出了一些之前的文章链接,大家若是有兴趣,也可以观看...
  • C语言文件

    2020-02-15 15:08:24
    我们在写c文件的时候经常引用stdio文件,该文件具有一个FILE 结构体类型。用数组存放若干文件。所以,利用这一特点,FILE t[5]表示存放5 个文件的信息。 如何使用? 文件的打开(fopen)关闭(fclose): 调用...
  • C语言基础之文件

    2017-06-16 16:44:13
    C程序在打开一个文件时,系统会自动在内存中开辟一个“文件信息区”,用来存放这些打开文件的有关信息。这些信息保存在一个结构体变量中,该结构是有系统定义的,取名为FILE.FILE是在头文件stdio.h 中定义的一个...
  • c语言程序设计课件

    2013-10-26 10:24:46
     第七章 结构体与共用体  第八章 文件概述  第九章 编译预处理 一维数组的初始化:  所谓初始化就是在定义数组的同时,给数组元素赋初始值。C语言规定,只有静态存储和外部存储数组才能初始化。方法见下例...
  • 用处 按照指定格式将Python数据转换为字符串,该字符串为字节流,如网络传输时,不能传输int,此时先将int转化为字节流,然后再发送; ... 处理c语言中的结构体; struct模块中的函数 函数 retu...
  • C语言文件操作的支持 1 C语言文件操作的支持 在C语言中,对文件的操作是利用FILE结构体进行的。 2 C++对文件操作的支持 ...Win32API提供了与文件操作相关的函数,这些函数功能强大,利用Crea
  • FILE*:它是C库中定义的一个结构体指针,我们在C语言文件操作时打开一个文件返回的指针类型就是它,在C库中是这样定义的,其中的_file它是一个整数,就是作为文件索引的描述符,C库是建立在系统调用上的,这个FILE...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 306
精华内容 122
关键字:

c语言结构体与c文件

c语言 订阅