鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 大苏打dd

[已解决]这段代码读文件是否有问题 easyx库

[复制链接]
 楼主| 发表于 2023-4-13 19:06:49 | 显示全部楼层
sfqxx 发表于 2023-4-13 18:49
#啊啊啊啊啊啊啊啊啊啊
这个问题可能是因为文件中的数据类型与读取时使用的数据类型不一致导致的。您可 ...

这是写文件的代码,您或许可以从这里看出读取部分存在的问题
  1. float hello()
  2. {
  3.     float TD,a,b,L1,L2,L3,B1,H1,hh;
  4.         d1=hs/dz;//vc=17,dz=6.5,hs=32;
  5.         vf=kv*vc;
  6.         n1=1000*vf/(p1*dz);
  7.         n2=n1/9550;
  8.         P1=T*n2;
  9.         Pz=4*P1;
  10.        
  11.         if(Pz>=1 && Pz<=1.5)
  12.         {TD=25,a=196,b=100,L1=32,L2=15,L3=32,B1=32,H1=25,hh=2.6;}//25
  13.         if(Pz>=1.5&&Pz<=3)
  14.         {TD=32,a=496,b=172,L1=40,L2=15,L3=32,B1=40,H1=32,hh=2.6;}//32

  15.        
  16.         FILE *fp = NULL ;
  17.         fp = fopen("D:\\cwenjian\\donglixiang2.txt","w") ;
  18. //        fprintf(fp,"TD=%f\n a=%f\n b=%f\n L1=%f\n L2=%f\n L3=%f\n B1=%f\n H1=%f\n hh=%f\n",TD,a,b,L1,L2,L3,B1,H1,hh);
  19.         fprintf(fp,"TD=%f  a=%f b=%f  L1=%f  L2=%f  L3=%f  B1=%f  H1=%f  hh=%f",TD,a,b,L1,L2,L3,B1,H1,hh);
  20.         fclose(fp);
  21.                
  22.         setrop2(R2_COPYPEN);//当前颜色
  23.         setfillcolor(WHITE);
  24.         setlinecolor(WHITE);
  25.         //覆盖原进度条区域
  26.        
  27.         setlinestyle(PS_NULL);//无线条
  28.         //设置文字填充背景为透明
  29.         //计算步骤
  30.        
  31.         EndBatchDraw();//结束缓存区
  32.        
  33.         return 0;
  34. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-13 19:30:14 From FishC Mobile | 显示全部楼层
这段代码只包括写文件的部分,无法看出读取文件存在的问题。请提供读取文件的代码以便更好地解决问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-13 19:35:07 | 显示全部楼层
sfqxx 发表于 2023-4-13 19:30
这段代码只包括写文件的部分,无法看出读取文件存在的问题。请提供读取文件的代码以便更好地解决问题。
  1. #include <graphics.h>
  2. #include <fstream>
  3. #include <sstream>
  4. #include <string>
  5. #include <iostream>
  6. #include <conio.h>

  7. int main()
  8. {
  9.     // 初始化图形模式
  10.     initgraph(1040, 480, SHOWCONSOLE);
  11.    //float a=496.000000, b=172.000000, L1=40.000000, L2=15.000000, L3=32.000000, B1=40.000000, H1=32.000000, hh=2.600000,GA=1;

  12.            // 打开文件
  13. std::ifstream file("D:\\cwenjian\\donglixiang2.txt");

  14. if (!file.is_open()) {
  15.     std::cerr << "无法打开文件!" << std::endl;
  16.     return 1;
  17. }
  18.    
  19.    float TD, a, b, L1, L2, L3, B1, H1, hh, GA;
  20.    file.read((char*)&TD, sizeof(float));
  21.    file.read((char*)&a, sizeof(float));
  22.    file.read((char*)&b, sizeof(float));
  23.    file.read((char*)&L1, sizeof(float));
  24.    file.read((char*)&L2, sizeof(float));
  25.    file.read((char*)&L3, sizeof(float));
  26.    file.read((char*)&B1, sizeof(float));
  27.    file.read((char*)&H1, sizeof(float));
  28.    file.read((char*)&hh, sizeof(float));
  29.    
  30. if (file.fail()) {
  31.     std::cerr << "读取数据失败!" << std::endl;
  32.     return 1;
  33. }

  34. // 打印读取的数据
  35.     std::cout << "TD: " << TD << std::endl;
  36.     std::cout << "a: " << a << std::endl;
  37.     std::cout << "b: " << b << std::endl;
  38. // ...


  39.         // 画矩形
  40.         //初始化图像网格
  41.         ::line(a,b,a,b+L1);
  42.         ::line(a,b+L1,a+H1,b+L1);
  43.         ::line(a+H1,b+L1,a+H1,b+L1-L2);
  44.         rectangle(a+H1,b+L1-L2+2,a+H1+hh,b+L1-2);
  45.         ::line(a+H1+hh/2,b+L1-L2+2,a+H1+hh/2,b+L1-2);
  46.         ::line(a+H1,b+L1-L2,a+H1,b+L1-L2-L3/5);
  47.         ::line(a+H1,b+L1-L2-L3/5,a+H1/3,b);
  48.         ::line(a,b,a+H1/3,b);
  49.         ::line(a+H1/4,b,a+H1/4,b-L1/6);
  50.         ::line(a+H1/4,b-L1/6,a+H1-H1/10,b-L1/6);
  51.         ::line(a+H1-H1/10,b-L1/6,a+H1-H1/10,b-L1/6+4*L3/5-5);
  52.        
  53.     // 关闭文件
  54.     file.close();
  55.        
  56.        
  57.     // 等待用户按键
  58.     _getch();
  59.        
  60.     // 关闭图形模式
  61.     closegraph();

  62.     return 0;
  63. }
复制代码

读取用的您之前发的这个方法,可以打开文件读取数据,但是读出来的数据就是异常值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-13 21:07:32 | 显示全部楼层    本楼为最佳答案   
您好,可能问题出在读取二进制文件时没有考虑字节对齐的问题。您可以尝试使用#pragma pack指令来解决这个问题。

例如,如果您的数据结构如下所示:


struct MyData {
    float TD;
    float a;
    float b;
    // ...
};


则可以在结构体定义之前加入以下指令:


#pragma pack(push,1)


并在结构体定义之后加入以下指令:

#pragma pack(pop)


这样就可以告诉编译器按照一个字节对齐来存储结构体,避免因为字节对齐导致的数据异常。

另外,您也可以尝试打印读取的数据的十六进制表示,以便更好地排查问题。例如:

std::cout << std::hex << TD << std::endl;
std::cout << std::hex << a << std::endl;
std::cout << std::hex << b << std::endl;
// ...


希望能够帮到您!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 12:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表