大苏打dd 发表于 2023-4-13 17:33:17

isdkz 发表于 2023-4-12 20:47
问题似乎出现在动力箱部分的图形渲染上。在动力箱代码中,我注意到你没有使用BeginBatchDraw()和FlushBat ...

我把代码拿出来写成一小段程序了,但是好像还是读取不出来数据,无法画出图形,老哥有空能帮我看一下读取是不是有问题吗#include <graphics.h>
#include <fstream>
#include <sstream>
#include <string>
#include <iostream>
#include <conio.h>

int main()
{
    // 初始化图形模式
    initgraph(1040, 480, SHOWCONSOLE);




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

    // 读取文件中的数据
    int TD,a,b,L1,L2,L3,B1,H1,hh,GA;
    char eq1, eq2, comma;
    std::string line;
    std::getline(file, line);
    std::stringstream ss(line);
    ss >> eq1 >> eq2 >> TD>> comma >> eq1 >> eq2 >>a >> comma >> eq1 >> eq2 >> b >>comma >> eq1 >> eq2 >>L1>> comma >> eq1 >> eq2 >>L2>>comma >> eq1 >> eq2 >>L3>> comma >> eq1 >> eq2 >>B1>> comma>> eq1 >> eq2 >>H1>> comma >> eq1 >> eq2 >>hh;

    // 画矩形
//初始化图像网格
        ::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*GA);

    // 关闭文件
    file.close();


    // 等待用户按键
    _getch();

    // 关闭图形模式
    closegraph();

    return 0;
}

isdkz 发表于 2023-4-13 17:38:03

大苏打dd 发表于 2023-4-13 17:33
我把代码拿出来写成一小段程序了,但是好像还是读取不出来数据,无法画出图形,老哥有空能帮我看一下读取 ...

你好,我帮你检查了一下代码,发现在读取数据的部分可能存在问题。这里是一个修改后的读取数据部分的代码:

std::ifstream file("D://cwenjian//donglixiang2.txt");

// 检查文件是否成功打开
if (!file.is_open()) {
    std::cerr << "无法打开文件!" << std::endl;
    return 1;
}

// 读取文件中的数据
int TD, a, b, L1, L2, L3, B1, H1, hh, GA;
char eq1, eq2, comma;
std::string line;
std::getline(file, line);
std::stringstream ss(line);
ss >> eq1 >> eq2 >> TD >> comma >> eq1 >> eq2 >> a >> comma >> eq1 >> eq2 >> b >> comma >> eq1 >> eq2 >> L1 >> comma >> eq1 >> eq2 >> L2 >> comma >> eq1 >> eq2 >> L3 >> comma >> eq1 >> eq2 >> B1 >> comma >> eq1 >> eq2 >> H1 >> comma >> eq1 >> eq2 >> hh;

if (file.fail()) {
    std::cerr << "读取数据失败!" << std::endl;
    return 1;
}

这里我增加了检查文件是否成功打开和检查读取数据是否成功的部分,如果有问题会返回错误信息。

另外,画图的部分你可能需要调整一下坐标,使其能在窗口范围内显示。如果数据读取正确,但是仍然无法画出图形,那么问题可能出在绘图部分的坐标设置上。你可以尝试将图形绘制在窗口的中心位置,或者调整窗口大小以适应图形尺寸。

大苏打dd 发表于 2023-4-13 17:49:04

isdkz 发表于 2023-4-13 17:38
你好,我帮你检查了一下代码,发现在读取数据的部分可能存在问题。这里是一个修改后的读取数据部分的代码 ...

#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;
        }
       
        // 读取文件中的数据
        int TD, a, b, L1, L2, L3, B1, H1, hh, GA;
        char eq1, eq2, comma;
        std::string line;
        std::getline(file, line);
        std::stringstream ss(line);
        ss >> eq1 >> eq2 >> TD >> comma >> eq1 >> eq2 >> a >> comma >> eq1 >> eq2 >> b >> comma >> eq1 >> eq2 >> L1 >> comma >> eq1 >> eq2 >> L2 >> comma >> eq1 >> eq2 >> L3 >> comma >> eq1 >> eq2 >> B1 >> comma >> eq1 >> eq2 >> H1 >> comma >> eq1 >> eq2 >> hh;
       
        if (file.fail()) {
                std::cerr << "读取数据失败!" << std::endl;
                return 1;
        }
        // 画矩形
        //初始化图像网格
        ::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*GA);
       
    // 关闭文件
    file.close();
       
       
    // 等待用户按键
    _getch();
       
    // 关闭图形模式
    closegraph();

    return 0;
}
我把检验部分写入之后图形还是不能出现,程序可以运行,但是我直接输入数据之后却可以正常出现图形,图形的坐标应该是没有问题的

isdkz 发表于 2023-4-13 17:52:37

大苏打dd 发表于 2023-4-13 17:49
我把检验部分写入之后图形还是不能出现,程序可以运行,但是我直接输入数据之后却可以正常出现图形,图 ...

感谢你的反馈。既然直接输入数据可以正常显示图形,那么问题应该是在读取数据时的类型。我注意到你的数据包含小数,但在读取数据时将它们定义为整数类型。请将相应的变量类型改为 float,然后再试一次。

这是修改后的读取数据部分的代码:

// 读取文件中的数据
int TD, GA;
float a, b, L1, L2, L3, B1, H1, hh;
char eq1, eq2, comma;
std::string line;
std::getline(file, line);
std::stringstream ss(line);
ss >> eq1 >> eq2 >> TD >> comma >> eq1 >> eq2 >> a >> comma >> eq1 >> eq2 >> b >> comma >> eq1 >> eq2 >> L1 >> comma >> eq1 >> eq2 >> L2 >> comma >> eq1 >> eq2 >> L3 >> comma >> eq1 >> eq2 >> B1 >> comma >> eq1 >> eq2 >> H1 >> comma >> eq1 >> eq2 >> hh >> comma >> eq1 >> eq2 >> GA;

将 int 类型改为 float 类型,并添加读取 GA 的部分。希望这次修改能解决问题。如果还有其他问题,请随时告诉我。

大苏打dd 发表于 2023-4-13 17:55:25

isdkz 发表于 2023-4-13 17:52
感谢你的反馈。既然直接输入数据可以正常显示图形,那么问题应该是在读取数据时的类型。我注意到你的数据 ...

我试了一下,应该是读取部分的问题,正常数据TD=32.000000, a=496.000000, b=172.000000 但是读出来的却是TD: -858993460
a: -858993460
b: -858993460 请问这应该怎么修改
#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;
        char eq1, eq2, comma;
        std::string line;
        std::getline(file, line);
        std::stringstream ss(line);
       
ss >> eq1 >> eq2 >> TD>> comma >> eq1 >> eq2 >>a >> comma >> eq1 >> eq2 >> b >>comma >> eq1 >> eq2 >>L1>> comma >> eq1 >> eq2 >>L2>>comma >> eq1 >> eq2 >>L3>> comma >> eq1 >> eq2 >>B1>> comma>> eq1 >> eq2 >>H1>> comma >> eq1 >> eq2 >>hh;

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

        if (file.fail()) {
                std::cerr << "读取数据失败!" << std::endl;
                return 1;
        }
        // 画矩形
        //初始化图像网格
        ::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*GA);
       
    // 关闭文件
    file.close();
       
       
    // 等待用户按键
    _getch();
       
    // 关闭图形模式
    closegraph();

    return 0;
}
这是最新代码,添加了一个显示读取数据的部分

大苏打dd 发表于 2023-4-13 19:22:17

isdkz 发表于 2023-4-13 17:52
感谢你的反馈。既然直接输入数据可以正常显示图形,那么问题应该是在读取数据时的类型。我注意到你的数据 ...

我看了一下 写入时是float型 读取也是float型,类型方面应该没问题,但是为什么读取出
TD: -858993460
a: -858993460
b: -858993460
这种异常值

大苏打dd 发表于 2023-4-13 20:16:53

isdkz 发表于 2023-4-13 17:52
感谢你的反馈。既然直接输入数据可以正常显示图形,那么问题应该是在读取数据时的类型。我注意到你的数据 ...

我好像找到问题所在了
std::stringstream ss(line);
ss >> eq1 >> eq2 >> TD >> comma >> eq1 >> eq2 >> a >> comma >> eq1 >> eq2 >> b >> comma >> eq1 >> eq2 >> L1 >> comma >> eq1 >> eq2 >> L2 >> comma >> eq1 >> eq2 >> L3 >> comma >> eq1 >> eq2 >> B1 >> comma >> eq1 >> eq2 >> H1 >> comma >> eq1 >> eq2 >> hh >> comma >> eq1 >> eq2 >> GA; std::stringstream ss(line) 这里定义的ss在遇到a,b这种单个字母时会出现顺序对不上的问题
页: 1 [2]
查看完整版本: easyx库怎么读文件