从文本文件中读取的我的C ++程序不起作用,但我没有看到任何代码错误?

时间:2015-01-02 17:34:15

标签: c++ eclipse g++

我编写了一些代码,这些代码可以从.txt文件中读取并显示该文件中的任何内容作为程序中的输出。我不知道为什么它不起作用。我没有在代码中看到任何错误。我还调试了程序,变量的所有值都是正确的。我使用Eclipse Luna作为带有g ++编译器的IDE。当程序运行并提示我输入数字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;

        }

    }

}

2 个答案:

答案 0 :(得分:0)

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

while(objectFile >> name >> power) {

此代码如何知道name结束和power开始的位置?

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

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

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

另外,另一个大问题是你没有代码将字符串强制转换为double。计算机并没有将其视为&#34; 12.56。&#34;它认为它是&#34; 1&#34; &#34; 2&#34; &#34;&#34; &#34; 5&#34; &#34; 6&#34; (即每个字符逐行)。

This question addresses this使用此代码:

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

答案 1 :(得分:0)

我建议再次检查您的代码,因为有一些严重的格式问题隐藏了其中的实际问题。例如,逐行浏览你的代码,你会看到你当前的代码只检查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

格式化mid功能。这通常会让读者感到困惑,应该避免。选择一种格式并坚持下去(作为一般规则)。如果您对自己的位置进行排查,我会愿意下注,您会发现该教程更适合您。

希望有所帮助!