另一个"期望在数字常量之前的不合格id"错误

时间:2014-03-18 16:32:46

标签: c++ compiler-errors

我正在努力开发一个非常简单的C / C ++程序,而且我在最后几个小时都在苦苦挣扎,我无法找到错误!它不是家庭作业,只是一个记住我旧C的练习。

MAIN.C

#include <iostream>
#include "Persona.h"
#include "BaseDeDatos.h"

using namespace std;

#define agregarPersona      1
#define eliminarPersona     2
#define imprimirListado     3
#define buscarPersona       4
#define salir               5

int main(){
    BaseDeDatos datos("Personas.txt");

    Persona piter(2000, "Andres Ledesma", "Cabrera 2000");
    datos.agregarPersona(piter);

    return 0;
}

BaseDeDatos.h

#ifndef BASEDEDATOS_H
#define BASEDEDATOS_H

#include "Persona.h"
#include <inttypes.h>
#include <vector>
#include <string.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

#define identificadorNombre     '%'
#define identificadorLegajo     '#'
#define identificadorDomicilio  '$'

class BaseDeDatos{
    public:
        BaseDeDatos(char nombreDelArchivo[]);

        void agregarPersona(Persona persona);
        bool eliminarPersona(long legajo);
        void imprimirListado();
        void buscarPersona(char nombre[]);

        ~BaseDeDatos();

    private:
        void obtenerLinea(unsigned int x, char buffer[]);
        bool existeEnArray(unsigned int data[], unsigned int tamanio, unsigned int x);

        FILE *ptrFile;
        char buffer[40];
        char nombreDelArchivo[40];

};

#endif // BASEDEDATOS_H

BaseDeDatos.c

#include "BaseDeDatos.h"

BaseDeDatos::BaseDeDatos(char nombreDelArchivo[]){
    strcpy(this->nombreDelArchivo, nombreDelArchivo);

    // Solo para pruebas
    remove(nombreDelArchivo);

    if ((ptrFile = fopen(nombreDelArchivo, "r+")) != NULL){
        std::cout << "Archivo existe" << std::endl;
    }else{
        std::cout << "Archivo no existe. Lo creamos." << std::endl;
        ptrFile = fopen(nombreDelArchivo, "w+");
    }

    char dato[41];
    char nombre[40];
    // Leo los nombres mientras no llegue al final del archivo
    while(fgets(dato, 40, ptrFile) != NULL){
        if(dato[0] == identificadorNombre){
            memcpy(nombre, &dato[1], 39);           // Copio el nombre sacando el identidicador
            std::cout << "Nombre: " << nombre << std::endl;
        }
        memset(dato, 0, strlen(dato));      // Borro el nombre para la nueva lectura
        memset(nombre, 0, strlen(nombre));
    }
}

void BaseDeDatos::agregarPersona(Persona persona){
    fseek(ptrFile, 0, SEEK_END);    // Voy al final del archivo
    fprintf(ptrFile, "%c%ld\n", identificadorLegajo, persona.obtenerLegajo());
    fprintf(ptrFile, "%c%s\n", identificadorDomicilio, persona.obtenerDomicilio());
    fprintf(ptrFile, "%c%s\n", identificadorNombre, persona.obtenerNombreCompleto());

    // Escribo al archivo
    fflush(ptrFile);
}

// Eliminamos a la persona dada tomando como identificador su legajo
bool BaseDeDatos::eliminarPersona(long legajo){
    unsigned int numeroDeLinea = 0;
    bool encontreLegajo = false;
    long legajoPersona = legajo;
    unsigned int lineasIgnoradas[3];

    rewind(ptrFile);    // Vamos al comienzo del archivo

    char dato[41];
    char legajoString[40];
    // Busco el legajo de la persona
    while(fgets(dato, 40, ptrFile) != NULL){
        if(dato[0] == identificadorLegajo){
            // Convierto el string (terminado en NULL) en un long en base 10
            memcpy(legajoString, &dato[1], 39);
            long legajo = strtoumax(legajoString, NULL, 10);

            if(legajo == legajoPersona){
                std::cout << "Legajo encontrado: " << legajo << std::endl;
                encontreLegajo = true;
                break;
            }
        }
        ++numeroDeLinea;
    }

    if(encontreLegajo == false){
        std::cout << "Legajo no encontrado" << std::endl;
        return false;
    }

    // Lineas a ignorar en el nuevo archivo
    lineasIgnoradas[0] = numeroDeLinea;
    lineasIgnoradas[1] = numeroDeLinea+1;
    lineasIgnoradas[2] = numeroDeLinea+2;

    rewind(ptrFile);
    numeroDeLinea = 0;

    // Creo un nuevo archivo con la extension .bak donde guardaremos el archivo con las lineas que deseamos eliminar
    char extension[] = {".bak"};
    char nombreNuevoArchivo[40];
    strcpy(nombreNuevoArchivo, nombreDelArchivo);
    strcat(nombreNuevoArchivo, extension);

    FILE *nuevoArchivo = fopen(nombreNuevoArchivo, "w+");
    while(fgets(dato, 40, ptrFile) != NULL){
        // Si la linea no debe ser ignorada la escribo en el nuevo archivo
        if(existeEnArray(lineasIgnoradas, 3, numeroDeLinea) == false){
            obtenerLinea(numeroDeLinea, buffer);
            std::cout << "Linea: " << buffer << std::endl;
            fputs(buffer, nuevoArchivo);
        }
        ++numeroDeLinea;
    }

    // Cerramos ambos archivos
    fclose(ptrFile);
    fclose(nuevoArchivo);

    // Eliminamos el archivo viejo
    remove(nombreDelArchivo);

    // Renombramos el archivo nuevo que creamos al por defecto
    rename(nombreNuevoArchivo, nombreDelArchivo);

    // Abrimos nuevamente el archivo
    ptrFile = fopen(nombreDelArchivo, "r+");
    return true;
}

void BaseDeDatos::imprimirListado(){

}

void BaseDeDatos::buscarPersona(char nombre[]){

}

/**
  * Verifica si en el array existe el elemento x
  * @param data array que contiene los datos a comprobar
  * @param tamanio tamaño del array pasado
  * @param x dato que se desea saber si existe en el array pasado
  */
bool BaseDeDatos::existeEnArray(unsigned int data[], unsigned int tamanio, unsigned int x){
    for(unsigned int n = 0; n < tamanio; ++n){
        if(data[n] == x) return true;
    }
    return false;
}

void BaseDeDatos::obtenerLinea(unsigned int x, char buffer[]){
    unsigned int numeroDeLinea = 0;
    int c;
    char dato[40];

    rewind(ptrFile);
    if(x == 0) {
        fgets(dato, 40, ptrFile);
        strcpy(buffer, dato);
        return;
    }
    while((c = fgetc(ptrFile)) != EOF){
        // 10 es el fin de linea LF (Line feed)
        if(c == 10){
            ++numeroDeLinea;
        }
        if(numeroDeLinea == x){
            fgets(dato, 40, ptrFile);
            strcpy(buffer, dato);
            std::cout << "Linea es: " << dato << std::endl;
            return;
        }
    }
}

BaseDeDatos::~BaseDeDatos(){
    fclose(ptrFile);
}

Persona.h

#ifndef PERSONA_H
#define PERSONA_H

class Persona{
    public:
        // Crea una clase Persona en donde tenemos que definir su legajo, nombre y domicilo
        Persona(long legajo, char nombreCompleto[], char domicilio[]);

        // Obtiene el numero de legajo de la persona
        long obtenerLegajo();

        // Obtiene el nombre de la persona
        char* obtenerNombreCompleto();

        // Obtiene el domicilio de la persona
        char* obtenerDomicilio();

        ~Persona();

    private:
        long legajo;
        char nombreCompleto[40];
        char domicilio[40];
};

#endif // PERSONA_H

Persona.c

#include "Persona.h"
#include <string.h>

Persona::Persona(long legajo, char nombreCompleto[], char domicilio[]){
    // Copio el legajo a la clase Persona
    this->legajo = legajo;

    // Copia el nombre que me pasaron, al nombre de la clase -> strcpy(destino, origen)
    strcpy(this->nombreCompleto, nombreCompleto);
    strcpy(this->domicilio, domicilio);
}

long Persona::obtenerLegajo(){
    return legajo;
}

char* Persona::obtenerNombreCompleto(){
    return nombreCompleto;
}

char* Persona::obtenerDomicilio(){
    return domicilio;
}

Persona::~Persona(){}

它并没有改变我使用BaseDeDatos的方法,我总是得到同样的错误:

  

第17行错误:数字常量之前的预期非限定标识

     

第17行错误:预期&#39;;&#39;在数字常量之前

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

1 个答案:

答案 0 :(得分:4)

#define agregarPersona      1

它将令牌agregarPersona的所有后续使用替换为1。所以

datos.agregarPersona(piter);

变为

datos.1(piter);

这是废话。

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

const int agregarPersona = 1;

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