大苏打dd 发表于 2023-4-13 13:58:27

这段代码读文件是否有问题 easyx库

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

    // 读取文件中的数据
    float 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 >> 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;

    // 画矩形
        init_figure();//初始化图像网格
        BeginBatchDraw();
        ::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();
本来直接输入a b这些字母的值是可以画出图形的,但是读文件的话就无法出现图形

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

有人能帮忙看看吗,就在4到10行这段

sfqxx 发表于 2023-4-13 17:35:36

根据代码分析,可能原因是文件路径不正确或文件内容格式有误导致无法正确读取值。建议检查文件路径是否正确,以及文件中数值是否按照正确的格式书写(如逗号、空格等)。如果确认文件路径和格式均正确,可以加入一些调试信息(如打印读取的值)来排查问题。
有用请设置最佳答案

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

我把代码拿出来写成一小段程序了,但是好像还是读取不出来数据,无法画出图形#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;
}

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

sfqxx 发表于 2023-4-13 17:35
根据代码分析,可能原因是文件路径不正确或文件内容格式有误导致无法正确读取值。建议检查文件路径是否正确 ...

我检查了一下,路径没问题,然后直接把需要读取的数据输入程序也能正常绘图,问题可能在读取部分
#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;
    // 打开文件
/*        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;*/

           // 打开文件
/* 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;
}
这是我直接输入数据的代码

sfqxx 发表于 2023-4-13 17:47:12

你好,根据你给出的代码和描述,可以看出问题可能在文件读取部分。你可以尝试在程序中添加一些调试信息,以便更好地定位问题所在。例如,在读取文件之前,可以添加以下代码检查文件是否成功打开:


std::ifstream file("D://cwenjian//donglixiang2.txt");
if (!file) {
    std::cerr << "Error opening file." << std::endl;
    return 1;
}


如果无法打开文件,程序将输出错误消息并退出。另外,您还可以在每个变量从文件中读取之后添加输出语句,以确保它们具有正确的值。例如:


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;
// ...


这样可以帮助您检查所有变量是否在从文件中读取时获得了正确的值。希望这些提示能够帮助您解决问题。

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

sfqxx 发表于 2023-4-13 17:47
你好,根据你给出的代码和描述,可以看出问题可能在文件读取部分。你可以尝试在程序中添加一些调试信息,以 ...

我试了一下,应该是读取部分的问题,正常数据TD=32.000000, a=496.000000, b=172.000000 但是读出来的却是TD: -858993460
a: -858993460
b: -858993460 请问这应该怎么修改

sfqxx 发表于 2023-4-13 17:54:56

这种情况通常是由于读取数据的方式或者类型不正确导致的,下面给出一些可能的解决方案供您参考:

1. 检查读取数据的方式是否正确:例如,如果您使用了fscanf函数,那么请确保格式控制字符串中包含了正确的类型说明符,例如"%f"表示读取浮点数,"%d"表示读取整数等等。同时,也要确保读取的数据和变量的类型匹配。

2. 检查读取数据的位置是否正确:有时候在读取数据之前,需要将文件指针移动到正确的位置,例如使用fseek函数等。

3. 检查读取数据的文件是否正确:有时候我们可能会误打误撞地打开了错误的文件,因此请确保您正在读取正确的文件。

4. 检查读取数据的范围是否正确:如果您的数据范围比较大,例如超过了int或float的取值范围,那么就可能会出现类似于-858993460这样的异常值。请检查数据是否在正确的范围内,并且可以尝试使用更大的数据类型来存储数据。

希望以上建议能够帮助您解决问题。

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

sfqxx 发表于 2023-4-13 17:54
这种情况通常是由于读取数据的方式或者类型不正确导致的,下面给出一些可能的解决方案供您参考:

1. 检 ...

要读取        float TD, a, b, L1, L2, L3, B1, H1, hh, GA;文件中这些数据,有什么好的办法吗
TD=32.000000, a=496.000000, b=172.000000, L1=40.000000, L2=15.000000, L3=32.000000, B1=40.000000, H1=32.000000, hh=2.600000 这些是文件中的数据,我觉得可能是我读取的方式不对,但是我不知道应该怎么读,请问有什么更好的办法吗
#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;
}
这是目前的代码

sfqxx 发表于 2023-4-13 18:04:16

你已经在代码中正确地打开了文件,并尝试读取它。但是读取数据的方式似乎有问题。下面是一个更简洁的方法来读取您的数据:


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 >> TD >> a >> b >> L1 >> L2 >> L3 >> B1 >> H1 >> hh >> GA;

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;
// ...

file.close();


这样,您可以直接使用`>>`运算符从文件流中读取数据。如果出现任何错误(例如格式不正确或到达文件结尾),则会发生故障。

大苏打dd 发表于 2023-4-13 18:18:30

sfqxx 发表于 2023-4-13 18:04
你已经在代码中正确地打开了文件,并尝试读取它。但是读取数据的方式似乎有问题。下面是一个更简洁的方法来 ...

#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;

file >> TD >> a >> b >> L1 >> L2 >> L3 >> B1 >> H1 >> hh ;

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;
}
这是最新的代码,现在读取数据失败了
读取数据失败!
Press any key to continue
这是运行结果

sfqxx 发表于 2023-4-13 18:34:22

根据代码和运行结果,很可能是读取文件时出现了问题。请确保文件路径正确,以及文件中的数据格式与程序中的数据类型对应。您可以添加更多的错误处理来帮助排除问题,例如在发生错误时输出更详细的错误信息或记录日志。

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

sfqxx 发表于 2023-4-13 18:34
根据代码和运行结果,很可能是读取文件时出现了问题。请确保文件路径正确,以及文件中的数据格式与程序中的 ...

文件路径没问题,文件中的数据是以float型存的,读取时也是用的float,应该也没问题,我采用原来读取的方式时可以读出来,但是读取的数据不对
      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;
这样读取可以成功读取数据,但是读取的数据时这样的
TD: -858993460
a: -858993460
b: -858993460

sfqxx 发表于 2023-4-13 18:42:08

大苏打dd 发表于 2023-4-13 18:41
文件路径没问题,文件中的数据是以float型存的,读取时也是用的float,应该也没问题,我采用原来读取的方 ...

emmn……{:10_265:}

sfqxx 发表于 2023-4-13 18:44:08

这个问题可能是因为读取的float数据类型中的二进制流和文件内容不匹配,导致解析错误。可以尝试使用以下方法:

1. 检查文件内容是否正确,确保文件中的数据和代码中的数据类型匹配。

2. 尝试使用另一种读取文件的方法,例如使用C++的fstream库中的read函数来读取文件内容。示例代码如下:

   
   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));
   

   读取文件时将每个变量按照float类型的大小进行读取,可能会解决读取错误的问题。

3. 如果以上方法仍然无法解决问题,可以考虑使用其他的文件读取库或者自己实现一个读取文件的类来解决问题。

大苏打dd 发表于 2023-4-13 18:44:22

sfqxx 发表于 2023-4-13 18:42
emmn……

{:5_99:}TD=32.000000, a=496.000000, b=172.000000, L1=40.000000, L2=15.000000, L3=32.000000, B1=40.000000, H1=32.000000, hh=2.600000
这些数据看起来也没超出范围 为什么读出来都变成异常值了

sfqxx 发表于 2023-4-13 18:44:44

大苏打dd 发表于 2023-4-13 18:44
TD=32.000000, a=496.000000, b=172.000000, L1=40.000000, L2=15.000000, L3=32.000000, B1=40. ...

答案见上↑

大苏打dd 发表于 2023-4-13 18:48:04

sfqxx 发表于 2023-4-13 18:44
答案见上↑

#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;
}
我尝试了一下,这次可以读取数据了,但是还是之前的问题,读取出的数据异常
TD: 4.40671e-008
a: 6.40941e-010
b: 6.40969e-010

大苏打dd 发表于 2023-4-13 18:48:40

大苏打dd 发表于 2023-4-13 18:48
我尝试了一下,这次可以读取数据了,但是还是之前的问题,读取出的数据异常
TD: 4.40671e-008
a: 6.4 ...

{:5_100:}好难啊这个

sfqxx 发表于 2023-4-13 18:49:45

大苏打dd 发表于 2023-4-13 18:48
好难啊这个

#啊啊啊啊啊啊啊啊啊啊
这个问题可能是因为文件中的数据类型与读取时使用的数据类型不一致导致的。您可以尝试检查文件中写入数据时所使用的数据类型,并将其与读取程序中使用的数据类型保持一致。例如,如果文件中使用了double类型,则在读取程序中也应该使用double类型进行读取。您还可以尝试在读取每个变量之前打印一些有用的信息,例如读取的字节数,以帮助进一步诊断问题。
页: [1] 2
查看完整版本: 这段代码读文件是否有问题 easyx库