C++ 错误 C2512 尝试使用 ifstream 读取 class、visual studio 中的文件 2008

C++ error C2512 trying to use ifstream to read a file in a class, visual studio 2008

我承认我是一个极端的C++新手,所以请原谅我可能很幼稚的问题。

我正在编写代码来解析汇编语言文件的基本部分,以便在第二阶段翻译成机器语言。

我已经构建了一个 parser class,但我无法成功打开外部程序集 .asm 文本文件,也无法将其提供给构成我的 parser class.

更具体地说,构造函数存在问题。 我在下面附上我写的完整代码:

// parses .asm assembly files
#include <iostream>
#include <fstream>
#include <varargs.h>
#include <string>
using namespace std;

class parser
{
private:
    istream inputfile;
    char inputname[30];
    string line;
    bool endfile;
    bool a_command, l_command, c_command; 
    string parsedLine, destParsedLine, compParsedLine, jumpParsedLine;
public:
    // default parser constructor
    parser()
    {
    }

    //parser(char* argv[])
    //{
    //  reader(argv[]);
    //}

    // opens input file
    string reader(char* argv[])
    {
        strcpy(inputname,argv[1]);
        strcat(inputname,".asm");
        // opens input .asm file
        ifstream inputfile(inputname);
        // reads first line
        getline(inputfile,line);
        if (line[0] == '/' || line.empty())
            inputfile.ignore(line.length(),'\n');
        return line;
    }

    // checks if at end file
    bool hasMoreCommands()
    {
        a_command = false;
        l_command = false;
        c_command = false;
        endfile = false;
        if (inputfile.eof())
            endfile = true;         
        return endfile;
    }

    // advances read of inputfile
    void advance()
    {
        if (line[0] == '/' || line.length() == 0)
            inputfile.ignore(line.length(),'\n');
        getline(inputfile,line);
    }

    /* function for labelling the type of command (address,computation,label) */
    bool commandType()
    {
        if (line[0] == '@')
            a_command = true;
        else if (line[0] == '(')
            l_command = true;
        else
            c_command = true;
        return a_command, l_command, c_command;
    }

    // function to select parsing function
    string selector()
    {
        if (a_command || l_command)
            symbol();
        else if (c_command)
        {
            dest();
            comp();
            jump();
            string parsedLine = destParsedLine + compParsedLine + jumpParsedLine;
        }
        return parsedLine;
    }

    // function returning address or label symbol
    string symbol()
    {
        if (a_command)
            string parsedLine = line.substr(1);
        else if (l_command)
            string parsedLine = line.substr(1,line.length()-1);
        return parsedLine;
    }

    // functions returning computation destination
    string dest()
    {
        size_t equal = line.find('='); //no '=' found = returns 'npos'
        string destParsedLine = line.substr(0,equal);
        return destParsedLine;
    }
    string comp()
    {
        size_t equal = line.find('=');
        size_t semicolon = line.find(';');
        string compParsedLine = line.substr(equal,semicolon);
        return compParsedLine;
    }
    string jump()
    {
        size_t semicolon = line.find(';');
        string jumpParsedLine = line.substr(semicolon);
        return jumpParsedLine;
    }
};

// main program
int main (int argc, char *argv[])
{
    bool endfile = false;
    string parsedLine;
    int count = 0;

    if ((argc != 2) || (strchr(argv[1],'.') != NULL))
    {
        cout << argv[0] << ": assembly .asm file argument should be supplied, without .asm extension\n";
        return 1;
    }

    parser attempt1 = parser();
    attempt1.reader(argv[]);
    while (!endfile)
    {
        attempt1.hasMoreCommands();
        if (endfile)
            return 0;
        if (count > 0)
            attempt1.advance();
        attempt1.commandType();
        attempt1.selector();
        cout << parsedLine << endl; //debugging purposes
        count++;
    }
}

我提供要从命令行打开的 .asm 文本文件的名称(.asm 文件与此 cpp 文件位于同一文件夹中)。

因此我需要使用 varargs.h,我想这可能是问题的一部分。

当我尝试构建它时,visual studio 2008 给出了以下 2 个错误:

1 error C2512: 'std::basic_istream<_Elem,_Traits>' : no appropriate default constructor available line 21

2 error C2059: syntax error : ']' line 137

感谢帮助,容忍侮辱,谢谢:)

您的 class 使用 std::istream 作为 inputfile 成员,但没有对其进行初始化。那是行不通的。

在这种情况下,您的 class 需要对其 inputfile 成员使用 std::ifstream,然后在尝试从中读取之前调用其 open() 方法.

此外,您的 reader() 方法忽略了 inputfile 成员,而是创建了一个同名的局部变量来读取。您需要摆脱那个局部变量,而是在您的 class 成员上调用 open()

按照@Remy Lebeau 的建议,下面修改后的代码至少可以正确编译(尽管仍然没有做它应该做的事情)

// parses .asm assembly files
#include <iostream>
#include <fstream>
#include <varargs.h>
#include <string>
using namespace std;

class parser
{
private:
    istream inputfile;
    char inputname[30];
    string line;
    bool endfile;
    bool a_command, l_command, c_command; 
    string parsedLine, destParsedLine, compParsedLine, jumpParsedLine;
public:
    // default parser constructor
    parser()
    {
    }

    // ignores inputfile line if comment or empty
    void ignoreline()
    {
        if (line[0] == '/' || line.empty())
            inputfile.ignore(line.length(),'\n');
    }

    // composes inputfile name and opens input file
    void reader(char* argv[])
    {
        strcpy(inputname,argv[1]);
        strcat(inputname,".asm");
        // opens input .asm file
        inputfile.open(inputname, fstream::in);
        // reads first line
        getline(inputfile,line);
        ignoreline();
    }

    // checks if at end file
    bool hasMoreCommands()
    {
        a_command = false;
        l_command = false;
        c_command = false;
        endfile = false;
        if (inputfile.eof())
            endfile = true;         
        return endfile;
    }

    // advances read of inputfile
    void advance()
    {
        ignoreline();
        getline(inputfile,line);
    }

    /* function for labelling the type of command (address,computation,label) */
    bool commandType()
    {
        if (line[0] == '@')
            a_command = true;
        else if (line[0] == '(')
            l_command = true;
        else
            c_command = true;
        return a_command, l_command, c_command;
    }

    // function to select parsing function
    string selector()
    {
        if (a_command || l_command)
            symbol();
        else if (c_command)
        {
            dest();
            comp();
            jump();
            string parsedLine = destParsedLine + compParsedLine + jumpParsedLine;
        }
        return parsedLine;
    }

    // function returning address or label symbol
    string symbol()
    {
        if (a_command)
            string parsedLine = line.substr(1);
        else if (l_command)
            string parsedLine = line.substr(1,line.length()-1);
        return parsedLine;
    }

    // functions returning computation destination
    string dest()
    {
        size_t equal = line.find('='); //no '=' found = returns 'npos'
        string destParsedLine = line.substr(0,equal);
        return destParsedLine;
    }

    string comp()
    {
        size_t equal = line.find('=');
        size_t semicolon = line.find(';');
        string compParsedLine = line.substr(equal,semicolon);
        return compParsedLine;
    }

    string jump()
    {
        size_t semicolon = line.find(';');
        string jumpParsedLine = line.substr(semicolon);
        return jumpParsedLine;
    }
};

// main program
int main (int argc, char *argv[])
{
    bool endfile = false;
    string parsedLine;
    int count = 0;

    if ((argc != 2) || (strchr(argv[1],'.') != NULL))
    {
         cout << argv[0] << ": assembly .asm file argument should be supplied, without .asm extension\n";
        return 1;
    }

    parser attempt1 = parser();
    attempt1.reader(argv);
    while (!endfile)
    {
        attempt1.hasMoreCommands();
        if (endfile)
            return 0;
        if (count > 0)
            attempt1.advance();
        attempt1.commandType();
        attempt1.selector();
        cout << parsedLine << endl;
        count++;
    }
    return 0;
}