另一个“在数字常量之前预期不合格的 id”错误

And*_*res -3 c++ compiler-errors

我正在尝试编写一个非常简单的 C/C++ 程序,在过去的几个小时里我一直在努力,但我找不到错误!这不是家庭作业,只是记住我的旧 C 的练习。

\n

主程序.c

\n
#include <iostream>\n#include "Persona.h"\n#include "BaseDeDatos.h"\n\nusing namespace std;\n\n#define agregarPersona      1\n#define eliminarPersona     2\n#define imprimirListado     3\n#define buscarPersona       4\n#define salir               5\n\nint main(){\n    BaseDeDatos datos("Personas.txt");\n\n    Persona piter(2000, "Andres Ledesma", "Cabrera 2000");\n    datos.agregarPersona(piter);\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

BaseDeDatos.h

\n
#ifndef BASEDEDATOS_H\n#define BASEDEDATOS_H\n\n#include "Persona.h"\n#include <inttypes.h>\n#include <vector>\n#include <string.h>\n#include <iostream>\n#include <stdio.h>\n#include <stdlib.h>\n\n#define identificadorNombre     '%'\n#define identificadorLegajo     '#'\n#define identificadorDomicilio  '$'\n\nclass BaseDeDatos{\n    public:\n        BaseDeDatos(char nombreDelArchivo[]);\n\n        void agregarPersona(Persona persona);\n        bool eliminarPersona(long legajo);\n        void imprimirListado();\n        void buscarPersona(char nombre[]);\n\n        ~BaseDeDatos();\n\n    private:\n        void obtenerLinea(unsigned int x, char buffer[]);\n        bool existeEnArray(unsigned int data[], unsigned int tamanio, unsigned int x);\n\n        FILE *ptrFile;\n        char buffer[40];\n        char nombreDelArchivo[40];\n\n};\n\n#endif // BASEDEDATOS_H\n
Run Code Online (Sandbox Code Playgroud)\n

BaseDeDatos.c

\n
#include "BaseDeDatos.h"\n\nBaseDeDatos::BaseDeDatos(char nombreDelArchivo[]){\n    strcpy(this->nombreDelArchivo, nombreDelArchivo);\n\n    // Solo para pruebas\n    remove(nombreDelArchivo);\n\n    if ((ptrFile = fopen(nombreDelArchivo, "r+")) != NULL){\n        std::cout << "Archivo existe" << std::endl;\n    }else{\n        std::cout << "Archivo no existe. Lo creamos." << std::endl;\n        ptrFile = fopen(nombreDelArchivo, "w+");\n    }\n\n    char dato[41];\n    char nombre[40];\n    // Leo los nombres mientras no llegue al final del archivo\n    while(fgets(dato, 40, ptrFile) != NULL){\n        if(dato[0] == identificadorNombre){\n            memcpy(nombre, &dato[1], 39);           // Copio el nombre sacando el identidicador\n            std::cout << "Nombre: " << nombre << std::endl;\n        }\n        memset(dato, 0, strlen(dato));      // Borro el nombre para la nueva lectura\n        memset(nombre, 0, strlen(nombre));\n    }\n}\n\nvoid BaseDeDatos::agregarPersona(Persona persona){\n    fseek(ptrFile, 0, SEEK_END);    // Voy al final del archivo\n    fprintf(ptrFile, "%c%ld\\n", identificadorLegajo, persona.obtenerLegajo());\n    fprintf(ptrFile, "%c%s\\n", identificadorDomicilio, persona.obtenerDomicilio());\n    fprintf(ptrFile, "%c%s\\n", identificadorNombre, persona.obtenerNombreCompleto());\n\n    // Escribo al archivo\n    fflush(ptrFile);\n}\n\n// Eliminamos a la persona dada tomando como identificador su legajo\nbool BaseDeDatos::eliminarPersona(long legajo){\n    unsigned int numeroDeLinea = 0;\n    bool encontreLegajo = false;\n    long legajoPersona = legajo;\n    unsigned int lineasIgnoradas[3];\n\n    rewind(ptrFile);    // Vamos al comienzo del archivo\n\n    char dato[41];\n    char legajoString[40];\n    // Busco el legajo de la persona\n    while(fgets(dato, 40, ptrFile) != NULL){\n        if(dato[0] == identificadorLegajo){\n            // Convierto el string (terminado en NULL) en un long en base 10\n            memcpy(legajoString, &dato[1], 39);\n            long legajo = strtoumax(legajoString, NULL, 10);\n\n            if(legajo == legajoPersona){\n                std::cout << "Legajo encontrado: " << legajo << std::endl;\n                encontreLegajo = true;\n                break;\n            }\n        }\n        ++numeroDeLinea;\n    }\n\n    if(encontreLegajo == false){\n        std::cout << "Legajo no encontrado" << std::endl;\n        return false;\n    }\n\n    // Lineas a ignorar en el nuevo archivo\n    lineasIgnoradas[0] = numeroDeLinea;\n    lineasIgnoradas[1] = numeroDeLinea+1;\n    lineasIgnoradas[2] = numeroDeLinea+2;\n\n    rewind(ptrFile);\n    numeroDeLinea = 0;\n\n    // Creo un nuevo archivo con la extension .bak donde guardaremos el archivo con las lineas que deseamos eliminar\n    char extension[] = {".bak"};\n    char nombreNuevoArchivo[40];\n    strcpy(nombreNuevoArchivo, nombreDelArchivo);\n    strcat(nombreNuevoArchivo, extension);\n\n    FILE *nuevoArchivo = fopen(nombreNuevoArchivo, "w+");\n    while(fgets(dato, 40, ptrFile) != NULL){\n        // Si la linea no debe ser ignorada la escribo en el nuevo archivo\n        if(existeEnArray(lineasIgnoradas, 3, numeroDeLinea) == false){\n            obtenerLinea(numeroDeLinea, buffer);\n            std::cout << "Linea: " << buffer << std::endl;\n            fputs(buffer, nuevoArchivo);\n        }\n        ++numeroDeLinea;\n    }\n\n    // Cerramos ambos archivos\n    fclose(ptrFile);\n    fclose(nuevoArchivo);\n\n    // Eliminamos el archivo viejo\n    remove(nombreDelArchivo);\n\n    // Renombramos el archivo nuevo que creamos al por defecto\n    rename(nombreNuevoArchivo, nombreDelArchivo);\n\n    // Abrimos nuevamente el archivo\n    ptrFile = fopen(nombreDelArchivo, "r+");\n    return true;\n}\n\nvoid BaseDeDatos::imprimirListado(){\n\n}\n\nvoid BaseDeDatos::buscarPersona(char nombre[]){\n\n}\n\n/**\n  * Verifica si en el array existe el elemento x\n  * @param data array que contiene los datos a comprobar\n  * @param tamanio tama\xc3\xb1o del array pasado\n  * @param x dato que se desea saber si existe en el array pasado\n  */\nbool BaseDeDatos::existeEnArray(unsigned int data[], unsigned int tamanio, unsigned int x){\n    for(unsigned int n = 0; n < tamanio; ++n){\n        if(data[n] == x) return true;\n    }\n    return false;\n}\n\nvoid BaseDeDatos::obtenerLinea(unsigned int x, char buffer[]){\n    unsigned int numeroDeLinea = 0;\n    int c;\n    char dato[40];\n\n    rewind(ptrFile);\n    if(x == 0) {\n        fgets(dato, 40, ptrFile);\n        strcpy(buffer, dato);\n        return;\n    }\n    while((c = fgetc(ptrFile)) != EOF){\n        // 10 es el fin de linea LF (Line feed)\n        if(c == 10){\n            ++numeroDeLinea;\n        }\n        if(numeroDeLinea == x){\n            fgets(dato, 40, ptrFile);\n            strcpy(buffer, dato);\n            std::cout << "Linea es: " << dato << std::endl;\n            return;\n        }\n    }\n}\n\nBaseDeDatos::~BaseDeDatos(){\n    fclose(ptrFile);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

角色.h

\n
#ifndef PERSONA_H\n#define PERSONA_H\n\nclass Persona{\n    public:\n        // Crea una clase Persona en donde tenemos que definir su legajo, nombre y domicilo\n        Persona(long legajo, char nombreCompleto[], char domicilio[]);\n\n        // Obtiene el numero de legajo de la persona\n        long obtenerLegajo();\n\n        // Obtiene el nombre de la persona\n        char* obtenerNombreCompleto();\n\n        // Obtiene el domicilio de la persona\n        char* obtenerDomicilio();\n\n        ~Persona();\n\n    private:\n        long legajo;\n        char nombreCompleto[40];\n        char domicilio[40];\n};\n\n#endif // PERSONA_H\n
Run Code Online (Sandbox Code Playgroud)\n

角色.c

\n
#include "Persona.h"\n#include <string.h>\n\nPersona::Persona(long legajo, char nombreCompleto[], char domicilio[]){\n    // Copio el legajo a la clase Persona\n    this->legajo = legajo;\n\n    // Copia el nombre que me pasaron, al nombre de la clase -> strcpy(destino, origen)\n    strcpy(this->nombreCompleto, nombreCompleto);\n    strcpy(this->domicilio, domicilio);\n}\n\nlong Persona::obtenerLegajo(){\n    return legajo;\n}\n\nchar* Persona::obtenerNombreCompleto(){\n    return nombreCompleto;\n}\n\nchar* Persona::obtenerDomicilio(){\n    return domicilio;\n}\n\nPersona::~Persona(){}\n
Run Code Online (Sandbox Code Playgroud)\n

用什么方法并不重要BaseDeDatos我使用什么方法,我总是会遇到相同的错误:

\n
\n

第 17 行错误:数字常量之前应有 unqualified-id

\n

第 17 行错误:预期为 ';' 数字常量之前

\n
\n

第 17 行是datos.agregarPersona(piter);我使用的任何方法BaseDeDatos。我找不到任何缺失的东西;,这让我发疯,这是一个简单的程序!

\n

Mik*_*our 5

#define agregarPersona      1
Run Code Online (Sandbox Code Playgroud)

这会将令牌的所有后续用途替换agregarPersona1。所以

datos.agregarPersona(piter);
Run Code Online (Sandbox Code Playgroud)

变成

datos.1(piter);
Run Code Online (Sandbox Code Playgroud)

这是无稽之谈。

您可能只是想摆脱这些宏 - 看起来没有任何东西在使用它们。如果您确实需要具有这些名称的常量,请改用变量:

const int agregarPersona = 1;
Run Code Online (Sandbox Code Playgroud)

不过,为了避免混淆,最好不要将它们命名为与类的成员函数相同的名称。