我的C++从文本文件读取的程序无法正常工作,但我没有看到任何代码错误?

My C++ program that reads from a text file won't work but I don't see any errors with code?

本文关键字:错误 代码 任何 工作 文件 读取 文本 C++ 程序 常工作 我的      更新时间:2023-10-16

我编写了一些代码,可以从.txt文件中读取并将该文件中的任何内容显示为程序中的输出。我不知道为什么它不起作用。我在代码中没有看到任何错误。我还调试了程序,变量的所有值都是正确的。我正在使用带有g++编译器的IDE的Eclipse Luna。当程序正在运行并提示我输入数字 1-3 时,当我输入 1 2 或 3 时,它不会执行任何操作,我不知道为什么。任何见解将不胜感激。谢谢!

 #include <iostream>
#include <fstream>
using namespace std;
//function prototypes
int getWhatTheyWant();
void displayItems(int x);
//getWhatTheyWant function
int getWhatTheyWant(){
    int choice;
    cout << "n  1 - just plain items" << endl;
    cout << "2     - helpful items" << endl;
    cout << "3     - harmful items" << endl;
    cout << "4     - quit program n" << endl;
    cin >> choice;
    return choice;
}
//displayItems function
void displayItems(int x){
    ifstream objectFile("objects.txt");
    string name;
    double power;
    if(x==1){
        while(objectFile >> name >> power){
            if(power==0){
                cout << name << ' ' << power << endl;
            }
    if(x==2){
        while(objectFile >> name >> power){
            if(power>0){
                cout << name << ' ' << power << endl;
            }
    if(x==3)
        while(objectFile >> name >> power){
            if(power<0){
                cout << name << ' ' << power << endl;
            }

        }
        }
    }
        }
    }
}

//main function
int main(){
    int whatTheyWant;

    whatTheyWant = getWhatTheyWant();
    while(whatTheyWant != 4){
        switch(whatTheyWant){
        case 1:
            displayItems(1);
            break;
        case 2:
            displayItems(2);
            break;
        case 3:
            displayItems(3);
            break;
        }
    }
}

我看到的主要问题是displayItems()

while(objectFile >> name >> power) {

这段代码如何知道name在哪里结束,power在哪里开始?

我建议将每个项目放在这样的一行上:

name
power
name
power
name
power
[and so on...]

然后,您可以使用getline()函数一次获取一行。

此外,另一个大问题是您没有代码将字符串转换回双精度。计算机不会将其视为"12.56"。它将其视为"1"2"。"5"6"(即每个字符逐行)。

此问题使用以下代码解决此问题:

#include <sstream>
int main(int argc, char *argv[])
{
    double f = 0.0;
    std::stringstream ss;
    std::string s = "3.1415";
    ss << s;
    ss >> f;
    cout << f;
}

我建议再次检查您的代码,因为存在一些严重的格式问题,隐藏了其中的实际问题。例如,逐行浏览代码,您会发现当前代码只检查 X==1 是否,因为您的其他 if 语句实际上嵌套在彼此中,看起来更像这样:

if(x==1)
{
    while(objectFile >> name >> power)
    {
        if(power==0)
        {
            cout << name << ' ' << power << endl;
        }
        if(x==2){
            while(objectFile >> name >> power)
            {
                if(power>0)
                {
                    cout << name << ' ' << power << endl;
                }
            if(x==3)
                while(objectFile >> name >> power)
                {
                    if(power<0)
                    {
                        cout << name << ' ' << power << endl;
                    }
                }
            }
        }
    }
}

你现在看到代码有什么问题了吗?正确格式化内容将大大提高您将来对编码进行故障排除的能力。另外值得注意的是,您从使用:

if(X==Y)
{
//Do Stuff
}

格式为使用 :

if(X==Y)
//Do Stuff

格式化中间函数。这通常会让读者感到困惑,应该避免。选择一种格式并坚持下去(作为一般规则)。我敢打赌,如果您对"}"的位置进行故障排除,您会发现本教程更有可能为您工作。

希望对您有所帮助!