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}\nRun Code Online (Sandbox Code Playgroud)\nBaseDeDatos.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\nRun Code Online (Sandbox Code Playgroud)\nBaseDeDatos.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}\nRun 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\nRun 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(){}\nRun Code Online (Sandbox Code Playgroud)\n用什么方法并不重要BaseDeDatos我使用什么方法,我总是会遇到相同的错误:
\n\n第 17 行错误:数字常量之前应有 unqualified-id
\n第 17 行错误:预期为 ';' 数字常量之前
\n
第 17 行是datos.agregarPersona(piter);我使用的任何方法BaseDeDatos。我找不到任何缺失的东西;,这让我发疯,这是一个简单的程序!
#define agregarPersona 1
Run Code Online (Sandbox Code Playgroud)
这会将令牌的所有后续用途替换agregarPersona为1。所以
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)
不过,为了避免混淆,最好不要将它们命名为与类的成员函数相同的名称。