在C ++函数中,如何从main()中打开的输入文件中读取?

时间:2014-11-21 01:30:10

标签: c++ iostream

我觉得这将是一个非常简单的问题,但我很难找到这种情况的一个例子。我有一个算法,读入输入文件并解析每行上的所有字符串。如果第一个字符为0,则将该行上的字符串写入输出文件。我已成功实现在main()中编程,但我想将其重写为可以从main()调用的函数(Line_Parse)。为此,需要在main()中打开输入文件并从函数中读取;但是,因为iostream名称" inp"在main()中定义,在函数中无法识别。现在附上了现在存在的功能和主程序的副本,我将非常感谢关于流" inp"可以传递给主程序。

void Line_Parse(char *&token,int MAX_CHARS_PER_LINE,
            int MAX_TOKENS_PER_LINE,char DELIMITER);

int main(int argc, const char * argv[]) {

    std::string Input_File("Input.txt");
    const int MAX_CHARS_PER_LINE = 1200;
    const int MAX_TOKENS_PER_LINE = 40;
    const char* const DELIMITER = " ";

    std::ifstream inp(Input_File, std::ios::in | std::ios::binary);
    if(!inp) {
        std::cout << "Cannot Open " << Input_File << std::endl;
        return 1; // Terminate program
    }
    char *token;
    // read each line of the file
    while (!inp.eof())
    {
        Line_Parse(token,MAX_CHARS_PER_LINE,MAX_TOKENS_PER_LINE,
                   *DELIMITER);
    }
    inp.close();
    return 0;
}

void Line_Parse(char *&token,int MAX_CHARS_PER_LINE,
                int MAX_TOKENS_PER_LINE,char DELIMITER)
{
    // read an entire line into memory
    char buf[MAX_CHARS_PER_LINE];
    inp.getline(buf, MAX_CHARS_PER_LINE);

    // parse the line into blank-delimited tokens
    int n = 0; // a for-loop index

    // array to store memory addresses of the tokens in buf
    *&token[MAX_TOKENS_PER_LINE] = {}; // initialize to 0

    // parse the line
    token[0] = *strtok(buf, &DELIMITER); // first token
    if (token[0]) // zero if line is blank
    {
        for (n = 1; n < MAX_TOKENS_PER_LINE; n++)
        {
            token[n] = *strtok(0, &DELIMITER); // subsequent tokens
            if (!token[n]) break; // no more tokens
        }
    }
}

2 个答案:

答案 0 :(得分:2)

实际上Input_Fileinput.txt文件的处理程序,为了在Line_Parse函数中使用此处理程序,您需要将其作为参数传递给函数。

void Line_Parse(char *&token,int MAX_CHARS_PER_LINE,int MAX_TOKENS_PER_LINE,
                                        char DELIMITER, std::ifstream & inp);

你会这样称呼它。

Line_Parse(token, MAX_CHARS_PER_LINE, MAX_TOKENS_PER_LINE, *DELIMITER, Input_File);

答案 1 :(得分:1)

将函数更改为接受inp作为参数:

void Line_Parse(char *&token,int MAX_CHARS_PER_LINE,
                int MAX_TOKENS_PER_LINE,char DELIMITER, std::ifstream inp)

然后将其称为:

Line_Parse(token, MAX_CHARS_PER_LINE, MAX_TOKENS_PER_LINE, *DELIMITER, inp);