从void函数访问局部变量

时间:2017-03-27 03:33:53

标签: c++

我有两个函数可以读取文件并初始化包含从读取的文件中解析的数据的变量。

这些变量包括几个向量,计数器(行数)和一些奇异变量(字符串和整数)。

我遇到的问题是这些变量都需要在以后的函数中访问,并且想法是避免全局变量。由于函数是无效的,它们不能返回变量,我发现(不像我的Python的常规语言)很难返回多个变量。

有什么更好的方法可以解决这个问题?

每个read *()函数中的向量都需要在我正在构建的新函数中访问。但我还需要num *变量,以及配方&服务变量。

编辑:我的代码目前

#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <iostream>

using namespace std;

void readNutrients(string input_file) {
    ifstream in(input_file.c_str());

    string line;
    vector<string> nName, nUnits;
    vector<double> nAmount, nCalories;
    string name, units;
    double amount, calories;

    int numNut = 0;

    while (getline(in, line)) {
        numNut++;

        int pos = line.find(';');
        name = line.substr(0, pos);
        nName.push_back(name);

        line = line.substr(pos + 1);
        istringstream iss(line);

        iss >> amount >> units >> calories;
        nAmount.push_back(amount);
        nUnits.push_back(units);
        nCalories.push_back(calories);
    }

}

void readRecipe(string input_file) {
    ifstream in(input_file.c_str());

    string line;
    string recipe;
    vector<string> rName, rUnits;
    vector<double> rAmount;
    string name, units;
    double amount;
    double servings;

    int numIng = 0;

    while (getline(in, line)) {
        numIng++;

        if (numIng == 1) {
            int pos = line.find('\n');
            recipe = line.substr(0, pos);
        }
        else if (numIng == 2) {
            istringstream iss(line);
            iss >> servings;
        }
        else {
            istringstream iss(line);
            iss >> amount >> units >> ws;
            rAmount.push_back(amount);
            rUnits.push_back(units);

            getline(iss, name);
            rName.push_back(name);
        }
    }

}

void readFiles(string nutrientFile, string recipeFile) {
    readNutrients(nutrientFile);
    readRecipe(recipeFile);
}


int main(int argc, char** argv) {

    readFiles(argv[1], argv[2]);

    return 0;
}

2 个答案:

答案 0 :(得分:2)

由于您已经包含了代码,因此我更了解您的代码。

您需要创建一个可以保存解析结果的结构。由于您的功能没有返回任何内容,因此您无法访问它的结果是合乎逻辑的。

我认为你的意图是从文件中读取营养素列表,并从该文件中读取所有营养素并填写程序中的列表。

问题是你的程序不知道营养成分是什么。你应该告诉他,通过宣布什么使营养成为一种营养素:

struct Nutrient {
    std::string name, unit;
    double amount, calories;
};

然后,您应该创建一系列营养素,而不是创建一堆值列表。

std::vector<Nutrient> readNutrients(std::string input_file) {
    // Here declare your vector:
    std::vector<Nutrient> nutrients;

    // declare line, calories, name...

    while (std::getline(in, line)) {
        // fill your variables name calories etc...

        // create a nutrient
        Nutrient n;

        // fill the nutrient with values from the parsing.
        n.name = name;
        n.unit = units;
        n.amount = amount;
        n.calories = calories;

        // add the nutrient to the list.
        nutrients.push_back(n);
    }

    // return a filled list of nutrient.
    return nutrients;
}

顺便说一下,你不需要num *变量,因为nutrients.size()会返回列表中的营养素数量。

该解决方案与食谱相同:创建一个类型以在程序中添加食谱的概念,并使用该类型。

请注意,此代码不是最佳代码,C ++ 11中的std::move应该会给您带来极大的加速。

答案 1 :(得分:1)

我不清楚你的情况。但是因为你不能将结果作为void函数的返回值,它可能通过使用指针或引用类型的输出参数得到结果。

例如:

void _read(const char* file,  vector<string>& r_list, int* pState)
{
    // do parsing file
    // do outputs
    *pState = (your_number);
    r_list.push_back("your string");
} 

希望这对你有用。