鱼C论坛

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

[已解决]easyx库怎么读文件

[复制链接]
 楼主| 发表于 2023-4-13 17:33:17 | 显示全部楼层
isdkz 发表于 2023-4-12 20:47
问题似乎出现在动力箱部分的图形渲染上。在动力箱代码中,我注意到你没有使用BeginBatchDraw()和FlushBat ...

我把代码拿出来写成一小段程序了,但是好像还是读取不出来数据,无法画出图形,老哥有空能帮我看一下读取是不是有问题吗
  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.   


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

  14.     // 读取文件中的数据
  15.     int TD,a,b,L1,L2,L3,B1,H1,hh,GA;
  16.     char eq1, eq2, comma;
  17.     std::string line;
  18.     std::getline(file, line);
  19.     std::stringstream ss(line);
  20.     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;

  21.     // 画矩形
  22. //初始化图像网格
  23.         ::line(a,b,a,b+L1);
  24.         ::line(a,b+L1,a+H1,b+L1);
  25.         ::line(a+H1,b+L1,a+H1,b+L1-L2);
  26.         rectangle(a+H1,b+L1-L2+2,a+H1+hh,b+L1-2);
  27.         ::line(a+H1+hh/2,b+L1-L2+2,a+H1+hh/2,b+L1-2);
  28.         ::line(a+H1,b+L1-L2,a+H1,b+L1-L2-L3/5);
  29.         ::line(a+H1,b+L1-L2-L3/5,a+H1/3,b);
  30.         ::line(a,b,a+H1/3,b);
  31.         ::line(a+H1/4,b,a+H1/4,b-L1/6);
  32.         ::line(a+H1/4,b-L1/6,a+H1-H1/10,b-L1/6);
  33.         ::line(a+H1-H1/10,b-L1/6,a+H1-H1/10,b-L1/6+4*L3/5-5*GA);

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


  36.     // 等待用户按键
  37.     _getch();

  38.     // 关闭图形模式
  39.     closegraph();

  40.     return 0;
  41. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

  7. // 读取文件中的数据
  8. int TD, a, b, L1, L2, L3, B1, H1, hh, GA;
  9. char eq1, eq2, comma;
  10. std::string line;
  11. std::getline(file, line);
  12. std::stringstream ss(line);
  13. 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;

  14. if (file.fail()) {
  15.     std::cerr << "读取数据失败!" << std::endl;
  16.     return 1;
  17. }
复制代码


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

另外,画图的部分你可能需要调整一下坐标,使其能在窗口范围内显示。如果数据读取正确,但是仍然无法画出图形,那么问题可能出在绘图部分的坐标设置上。你可以尝试将图形绘制在窗口的中心位置,或者调整窗口大小以适应图形尺寸。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-13 17:49:04 | 显示全部楼层
isdkz 发表于 2023-4-13 17:38
你好,我帮你检查了一下代码,发现在读取数据的部分可能存在问题。这里是一个修改后的读取数据部分的代码 ...
  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.        
  15.     // 读取文件中的数据

  16.        
  17.         // 检查文件是否成功打开
  18.         if (!file.is_open()) {
  19.                 std::cerr << "无法打开文件!" << std::endl;
  20.                 return 1;
  21.         }
  22.        
  23.         // 读取文件中的数据
  24.         int TD, a, b, L1, L2, L3, B1, H1, hh, GA;
  25.         char eq1, eq2, comma;
  26.         std::string line;
  27.         std::getline(file, line);
  28.         std::stringstream ss(line);
  29.         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;
  30.        
  31.         if (file.fail()) {
  32.                 std::cerr << "读取数据失败!" << std::endl;
  33.                 return 1;
  34.         }
  35.         // 画矩形
  36.         //初始化图像网格
  37.         ::line(a,b,a,b+L1);
  38.         ::line(a,b+L1,a+H1,b+L1);
  39.         ::line(a+H1,b+L1,a+H1,b+L1-L2);
  40.         rectangle(a+H1,b+L1-L2+2,a+H1+hh,b+L1-2);
  41.         ::line(a+H1+hh/2,b+L1-L2+2,a+H1+hh/2,b+L1-2);
  42.         ::line(a+H1,b+L1-L2,a+H1,b+L1-L2-L3/5);
  43.         ::line(a+H1,b+L1-L2-L3/5,a+H1/3,b);
  44.         ::line(a,b,a+H1/3,b);
  45.         ::line(a+H1/4,b,a+H1/4,b-L1/6);
  46.         ::line(a+H1/4,b-L1/6,a+H1-H1/10,b-L1/6);
  47.         ::line(a+H1-H1/10,b-L1/6,a+H1-H1/10,b-L1/6+4*L3/5-5*GA);
  48.        
  49.     // 关闭文件
  50.     file.close();
  51.        
  52.        
  53.     // 等待用户按键
  54.     _getch();
  55.        
  56.     // 关闭图形模式
  57.     closegraph();

  58.     return 0;
  59. }
复制代码

我把检验部分写入之后图形还是不能出现,程序可以运行,但是我直接输入数据之后却可以正常出现图形,图形的坐标应该是没有问题的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

  1. // 读取文件中的数据
  2. int TD, GA;
  3. float a, b, L1, L2, L3, B1, H1, hh;
  4. char eq1, eq2, comma;
  5. std::string line;
  6. std::getline(file, line);
  7. std::stringstream ss(line);
  8. 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 的部分。希望这次修改能解决问题。如果还有其他问题,请随时告诉我。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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 请问这应该怎么修改
  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.        
  15.     // 读取文件中的数据

  16.        
  17.         // 检查文件是否成功打开
  18.         if (!file.is_open()) {
  19.                 std::cerr << "无法打开文件!" << std::endl;
  20.                 return 1;
  21.         }
  22.        
  23.         // 读取文件中的数据
  24.         float TD, a, b, L1, L2, L3, B1, H1, hh, GA;
  25.         char eq1, eq2, comma;
  26.         std::string line;
  27.         std::getline(file, line);
  28.         std::stringstream ss(line);
  29.        
  30. 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;

  31. std::cout << "TD: " << TD << std::endl;
  32. std::cout << "a: " << a << std::endl;
  33. std::cout << "b: " << b << std::endl;
  34. // ...

  35.         if (file.fail()) {
  36.                 std::cerr << "读取数据失败!" << std::endl;
  37.                 return 1;
  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*GA);
  52.        
  53.     // 关闭文件
  54.     file.close();
  55.        
  56.        
  57.     // 等待用户按键
  58.     _getch();
  59.        
  60.     // 关闭图形模式
  61.     closegraph();

  62.     return 0;
  63. }
  64. 这是最新代码,添加了一个显示读取数据的部分
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我看了一下 写入时是float型 读取也是float型,类型方面应该没问题,但是为什么读取出
TD: -858993460
a: -858993460
b: -858993460
这种异常值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我好像找到问题所在了
  1. std::stringstream ss(line);
  2. 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这种单个字母时会出现顺序对不上的问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 22:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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