大苏打dd 发表于 2023-4-13 19:06:49

sfqxx 发表于 2023-4-13 18:49
#啊啊啊啊啊啊啊啊啊啊
这个问题可能是因为文件中的数据类型与读取时使用的数据类型不一致导致的。您可 ...

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

       
        FILE *fp = NULL ;
        fp = fopen("D:\\cwenjian\\donglixiang2.txt","w") ;
//        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);
        fprintf(fp,"TD=%fa=%f b=%fL1=%fL2=%fL3=%fB1=%fH1=%fhh=%f",TD,a,b,L1,L2,L3,B1,H1,hh);
        fclose(fp);
               
        setrop2(R2_COPYPEN);//当前颜色
        setfillcolor(WHITE);
        setlinecolor(WHITE);
        //覆盖原进度条区域
       
        setlinestyle(PS_NULL);//无线条
        //设置文字填充背景为透明
        //计算步骤
       
        EndBatchDraw();//结束缓存区
       
        return 0;
}

sfqxx 发表于 2023-4-13 19:30:14

这段代码只包括写文件的部分,无法看出读取文件存在的问题。请提供读取文件的代码以便更好地解决问题。

大苏打dd 发表于 2023-4-13 19:35:07

sfqxx 发表于 2023-4-13 19:30
这段代码只包括写文件的部分,无法看出读取文件存在的问题。请提供读取文件的代码以便更好地解决问题。

#include <graphics.h>
#include <fstream>
#include <sstream>
#include <string>
#include <iostream>
#include <conio.h>

int main()
{
    // 初始化图形模式
    initgraph(1040, 480, SHOWCONSOLE);
   //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;

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

if (!file.is_open()) {
    std::cerr << "无法打开文件!" << std::endl;
    return 1;
}
   
   float TD, a, b, L1, L2, L3, B1, H1, hh, GA;
   file.read((char*)&TD, sizeof(float));
   file.read((char*)&a, sizeof(float));
   file.read((char*)&b, sizeof(float));
   file.read((char*)&L1, sizeof(float));
   file.read((char*)&L2, sizeof(float));
   file.read((char*)&L3, sizeof(float));
   file.read((char*)&B1, sizeof(float));
   file.read((char*)&H1, sizeof(float));
   file.read((char*)&hh, sizeof(float));
   
if (file.fail()) {
    std::cerr << "读取数据失败!" << std::endl;
    return 1;
}

// 打印读取的数据
    std::cout << "TD: " << TD << std::endl;
    std::cout << "a: " << a << std::endl;
    std::cout << "b: " << b << std::endl;
// ...


        // 画矩形
        //初始化图像网格
        ::line(a,b,a,b+L1);
        ::line(a,b+L1,a+H1,b+L1);
        ::line(a+H1,b+L1,a+H1,b+L1-L2);
        rectangle(a+H1,b+L1-L2+2,a+H1+hh,b+L1-2);
        ::line(a+H1+hh/2,b+L1-L2+2,a+H1+hh/2,b+L1-2);
        ::line(a+H1,b+L1-L2,a+H1,b+L1-L2-L3/5);
        ::line(a+H1,b+L1-L2-L3/5,a+H1/3,b);
        ::line(a,b,a+H1/3,b);
        ::line(a+H1/4,b,a+H1/4,b-L1/6);
        ::line(a+H1/4,b-L1/6,a+H1-H1/10,b-L1/6);
        ::line(a+H1-H1/10,b-L1/6,a+H1-H1/10,b-L1/6+4*L3/5-5);
       
    // 关闭文件
    file.close();
       
       
    // 等待用户按键
    _getch();
       
    // 关闭图形模式
    closegraph();

    return 0;
}
读取用的您之前发的这个方法,可以打开文件读取数据,但是读出来的数据就是异常值

sfqxx 发表于 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;
// ...


希望能够帮到您!
页: 1 [2]
查看完整版本: 这段代码读文件是否有问题 easyx库