Pasar char* a una función c++

Así que tengo este problema que no puedo solucionar :-( En mi .h tengo esto:

protected:
   char* _textPath_1;
   FileReader* _reader_3;

en .cpp tengo:

_reader_3 = new FileReader();
_textPath_1 = "foo";
_reader_3->openFile(_textPath_1);

Y FileReader tiene esto:

private:
   char* fileName;
public:
   signed int openFile(char* name);

pero si escribo esto (solo para probar):

signed int FileReader::openFile(char* name) {
    std::cout << name << std::endl;
    fileName = name;
    stream.open(fileName, std::ios::in);
    if (!stream.is_open()) {
        FileReader::printErrorOpeningFile(fileName);
        stream.close();
        return -1;
    }
   return 0;
}

fileName es un char * y necesito que obtenga el mismo valor (foo) de nombre. Recibo un error y ni siquiera puedo imprimir el nombre, solo imprime una línea en blanco ... ¿por qué?

EDITAR: no funciona incluso usando strcpy. En realidad, dentro de la función no puedo imprimir el valor del nombre, es como si hubiera sido "desinicializado"

preguntado el 27 de julio de 12 a las 17:07

¿Por qué quieres jugar con char * en C++ cuando tienes std::string? -

Por cierto, ¿realmente estás tratando de asignar un char * a otra variable de tipo char *? necesitas usar strcpy para eso... -

Se está bloqueando en fileName = nombre; -

Y tampoco puedo leer el nombre dentro de mi función:

¿Cuál es el tipo de nombre de archivo? ¿Y cuál es el valor del puntero _reader_3? -

3 Respuestas

Necesita asignar espacio para su cadena de texto _textPath_1. Prueba esto en su lugar.

char myTextString[] = "foo";
_textPath_1 = myTextString;

Esto crea una matriz de caracteres local (una cadena de caracteres), que se inicializa para "foo\0". Luego copia la dirección de esa cadena de caracteres en su puntero de caracteres _textPath_1. Como LOCAL almacenamiento, solo será válido en el bloque de código local y no se podrá utilizar una vez que su código haya salido de su alcance. Si necesita esa cadena más allá del bloque de código local, deberá asignarla desde la memoria del montón (usando new por ejemplo) y recuerde desasignarlo una vez que haya terminado con él.

No se puede utilizar strcpy con su puntero no asignado porque strcpy espera el destino char* para estar apuntando a una matriz de caracteres que actúa como su búfer de cadena de destino. Como no ha asignado ningún espacio de caracteres, no puede copiar "foo" en su _textPath_1, y es por eso que obtiene un error de tiempo de ejecución cuando intenta strcpy él.

Estas y otras diversiones con char* es porque std::string fue inventado. No se preocupe por asignar y desasignar espacio, tener que usar strcpy para copiar su valor, etc., etc. Considere usar std::string _textPath_1 en lugar de tu char* _textPath_1.

Respondido 27 Jul 12, 21:07

Debe asignar _reader_3 antes de llamar a la función.

FileReader* _reader_3 = nuevo FileReader;

Supongo que fileName es su variable miembro. Acceder a punteros sin inicialización dará como resultado resultados impredecibles

Respondido 27 Jul 12, 17:07

Ok, tal vez la próxima vez publique algo, es mejor si escribo todo :-D _reader_3 ya está asignado - endamaco

¿Puedes copiar y pegar todo el archivo? - InvitadoPermanente

Si realmente está definiendo variables globales en su archivo de encabezado:

char* _textPath_1;
FileReader* _reader_3;

Entonces no deberías estar haciendo eso. Las variables globales deben declararse en archivos de encabezado, pero definirse en un archivo de implementación.


Este código funciona bien:

#include <iostream>
#include <fstream>

struct FileReader {
    char* fileName;
    std::fstream stream;

    signed int FileReader::openFile(char* name) {
        std::cout << name << std::endl;
        fileName = name;
        stream.open(fileName, std::ios::in);
        if (!stream.is_open()) {
            FileReader::printErrorOpeningFile(fileName);
            stream.close();
            return -1;
        }
        return 0;
    }

    void printErrorOpeningFile(char *) {}
};

int main() {
    char* _textPath_1;
    FileReader* _reader_3;

    _reader_3 = new FileReader();
    _textPath_1 = "foo";
    _reader_3->openFile(_textPath_1);
    delete _reader_3;
}

Respondido 27 Jul 12, 18:07

Están definidos en un bloque protegido en mi archivo .h - endamaco

protegido como? ¿Quiere decir que en realidad no son variables globales y que, de hecho, son variables de instancia de clase con un especificador de acceso de 'protegido:'? Debe mencionar exactamente cuáles son en su pregunta. - bames53

ok ... acabo de editar mi pregunta ... de todos modos: ¡sí! Están en un bloque protegido: - endamaco

El hecho de que estén protegidos no es tan relevante como el hecho de que sean variables de instancia. Debe editar su pregunta para que contenga un programa completo y construible (pero pequeño) que muestre el problema. De lo contrario, la gente seguirá adivinando cuál es el programa y señalará los errores relacionados con sus conjeturas, no necesariamente con su problema real. - bames53

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.