[Hilo Oficial] Esto también es otro arte...el ARTE de programar
Cita
La cosa thewazaa, es que yo no usaba cin a secas, sino cin.getline que precisamente soluciona el problema porque sigue leyendo aunque haya espacios en blanco y acaba en el centinela que se añade por defecto cuando creas una cadena de caracteres
De ahi que no entienda que quedase algo en el buffer que jodiese las posteriores lecturas, pero bueno solucionado esta

Ahora lo que si que no se es como hacer lo mismo pero leyendo de archivo en vez desde teclado, la unica lectura de archivo que me sigue dando por saco es la de cadena de caracteres mientras que los int me los lee y guarda perfectamente
He probado con esto
Código:
getline(archivo, s);
strcpy(cadena,s.c_str());

Donde "cadena" es una cadena de caracteres y "s" un string, pero a partir de esa lectura los siguientes datos los toma como "basura" y no lee bien
Si quito esa parte del codigo y dejo solo la lectura de int va perfecto
[Imagen: ifar.png]
Cita
pero lo usabas despues del cin a secas. Ahí el problema.

Leyendo la cadena desde un archivo... ahi tienes un problema diferente. Cuando tu le das a enter, en el teclado, tienes el caracter ascii 0. Final de string. En un archivo podrias tenerlo siempre que lo editaras en hexadecimal, pero...

Es un palo para un ejercicio. De mal tocar y poco visible para ti y el profesor.

Recomendacion:

getLine (archivo, s, ".") Donde el punto es el final del string.

Prueba
[align=center]Y mientras, en SobreLoQueOpinar...

[b]Análisis: Metroid Prime 3: Corruption
Cita
No compila, me dice que no renoce la funcion getline con esa lista de argumentos
El fallo esta en que a la hora de hacer la lectura, no lee la cadena o el string(he probado con ambos y nada) y partir de ahi debe abortar la lectura del archivo y solo proporciona datos basura

Si pones primero la lectura del string no da fallos aunque tengas 5 cosas despues, falla cuando antes de esa lectura lee algo que no es un string, en mi caso un numero
Debe de haber alguna funcion que limpie el flujo o algo asi para que no falle la lectura del string cuando tiene cosas antes
[Imagen: ifar.png]
Cita
prueba con comillas simples. Lo del final es un carácter.

A parte de eso, tienes que empezar a buscar información de las funciones y apis en internet. No puedes depender de apuntes

http://en.cppreference.com/w/cpp/io/basi...am/getline
[align=center]Y mientras, en SobreLoQueOpinar...

[b]Análisis: Metroid Prime 3: Corruption
Cita
Fin de líne es '\n' en Windows/Linux.

Con getline(archivo, s, '\n') debería irte. Sino, te recomiendo el clásico bucle while con el ifstream usando good o cualquier otra alternativa de las que tiene.
Hago juegos para odiarlos luego.
Cita
Vale con las comillas simples "parece" que va, digo parece porque si luego quiero mostrar esa cadena por pantalla me saca simbolos raros en vez del nombre de la persona por ejemplo
Sabes que pasa thewazaa, que luego el profesor no nos deja usar cosas que hemos encontrado en internet porque segun el son "chapuzas que se inventa la gente" y que solo permite usar lo de clase  Facepalm

RGBCYMK, con el '\n' en vez del '.' peta la lectura
[Imagen: ifar.png]
Cita
Petará al llegar al final del fichero con casi total seguridad. Para evitarlo habría que mirar que no es final de línea, o leer carácter a carácter.

De todas formas, aunque os lo estén enseñando así (conmigo también lo hicieron) no es la forma correcta de tratar ficheros. Por tu cuenta recomiendo que mires ifstream .read() y demás funciones de ficheros que son estándar en C/C++
Hago juegos para odiarlos luego.
Cita
Descuida que despues de meses teniendo que tragar chapuzas asi he caido en la cuenta que tengo que ir mirandome cosas alternativas

Lo malo es que no nos dejan usarlas si no se han visto en clase, y aqui me ves con casi todos los subprogramas hechos y sin poder empezar a construir el main porque no puedo cargar los datos de los ficheros en las estructuras  cabezazo
Ya me estoy viendo que en la tutoria del jueves me voy a tirar 1 hora para que no me acabe resolviendo el problema
[Imagen: ifar.png]
Cita
Veamos, ifar. El tema es fácil.

Estás leyendo datos de diferente indole.

Unos son estructuras fijas, de 1, 2, 4 bytes. Estos no tienes problemas si existen (si no existen, los tienes, obviamente)

Los otros, son estructuras no fijas de tamaño limitado, esos strings. Esos strings necesitan un caracter final. Por defecto es el código ascii 0, o puede ser el punto (sigo recomendandolo para simplificarte el ejercicio, o el salto de linea.

Pero no es lo mismo un salto de linea que un final de fichero... con lo que si no tienes ese salto de linea se te presentará una clara excepción, pues te habrás salido fuera de la memoria.

Que no es la forma más correcta de tratar los ficheros? no te estan eseñando eso. Te estan haciendo ver los verdaderos problemas de leer datos, obligandote a acceder a niveles muy bajos.

Podría ser peor. En mis tiempos eso nos lo hacían hacer en ensamblador.

Y eso si que es una pesadilla.
[align=center]Y mientras, en SobreLoQueOpinar...

[b]Análisis: Metroid Prime 3: Corruption
Cita
Se a lo que te refieres, pero se supone que al usar el string s y luego hacer la conversion a cadena con c_str() ,no me tengo que preocupar del tema del salto de linea puesto que el getline en strings lee automaticamente hasta fin de linea ¿no?
Al menos eso tengo yo aqui en las tranparencias de clase

Supongo que habra alguna forma de leer directamente cadenas de archivos sin tener que hacer el trapicheo de la conversion que digo(y ahi si que tendria que definir que leyese hasta '\0' que es centinela por defecto) pero no se como ni tampoco me van a dejar usarlo
De todas formas gracias a ambos por tomaros la molestia de ayudar a este estudiante de 1º de carrera ^^

PD:Ensamblador el lo puto peor, tambien me las he visto con el y me dan escalofrios xD
[Imagen: ifar.png]
Cita
No. Ifar.

Veamos, esto es lo primero que has de entender. El getline que estas usando no es leer lineas que entendamos nosotros, en modo plano. No es lineas hasta salto de linea o fin de archivo, como seria el getline de c# o java o php.

El getline que estas usando se basa en que el final delimitador de la linea es por defecto el \0 o el caracter que hayas puesto.

Estas con c++... eso significa que las apis más básicas están a un nivel muy básico. Casi a lenguaje máquina.

Leer cadenas de un archivo es algo muy fácil. Lo primero que se necesitan son las estructuras de datos (te copio un ejemplo de internet, mediante bmp, simplifica el ejemplo)

Esto es el header. La cabecera de la imagen. Muchos archivos tienen mas o menos la misma estructura en los ficheros y comprobando ciertos puntos aquí es fácil saber si es un BMP o no
Código:
#pragma pack(push, 1)

typedef struct tagBITMAPFILEHEADER
{
    WORD bfType;  //specifies the file type
    DWORD bfSize;  //specifies the size in bytes of the bitmap file
    WORD bfReserved1;  //reserved; must be 0
    WORD bfReserved2;  //reserved; must be 0
    DWORD bOffBits;  //species the offset in bytes from the bitmapfileheader to the bitmap bits
}BITMAPFILEHEADER;

#pragma pack(pop)

Esto es el header del bmp. Ancho, alto, colores, etc.

Código:
#pragma pack(push, 1)

typedef struct tagBITMAPINFOHEADER
{
    DWORD biSize;  //specifies the number of bytes required by the struct
    LONG biWidth;  //specifies width in pixels
    LONG biHeight;  //species height in pixels
    WORD biPlanes; //specifies the number of color planes, must be 1
    WORD biBitCount; //specifies the number of bit per pixel
    DWORD biCompression;//spcifies the type of compression
    DWORD biSizeImage;  //size of image in bytes
    LONG biXPelsPerMeter;  //number of pixels per meter in x axis
    LONG biYPelsPerMeter;  //number of pixels per meter in y axis
    DWORD biClrUsed;  //number of colors used by th ebitmap
    DWORD biClrImportant;  //number of colors that are important
}BITMAPINFOHEADER;

#pragma pack(pop)

El código para pillar el fichero.

Pasos

1. Leer header
2. Verificar header. Si no es un bmp... fin
3. Leer header BMP
4. Ir a la posicion de datos iniciales del BMP, en el fichero
5. Conseguirse memoria dinámica para trabajar
6. Conseguirse los datos (en este caso todos... cosa que es algo bestia, pero en un BMP esos datos son exactamente la imagen, siempre que sea una imagen de 24 bits sin compresión, como sobreentiende el ejemplo que he copiado
7. Hacer trabajo extra para conseguir el resultado necesario. en este caso girar unos bytes para tener un formato compatible en pantallas.

Código:
unsigned char *LoadBitmapFile(char *filename, BITMAPINFOHEADER *bitmapInfoHeader)
{
    FILE *filePtr; //our file pointer
    BITMAPFILEHEADER bitmapFileHeader; //our bitmap file header
    unsigned char *bitmapImage;  //store image data
    int imageIdx=0;  //image index counter
    unsigned char tempRGB;  //our swap variable

    //open filename in read binary mode
    filePtr = fopen(filename,"rb");
    if (filePtr == NULL)
        return NULL;

    //read the bitmap file header
    fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER,1,filePtr);

    //verify that this is a bmp file by check bitmap id
    if (bitmapFileHeader.bfType !=0x4D42)
    {
        fclose(filePtr);
        return NULL;
    }

    //read the bitmap info header
    fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER),1,filePtr);

    //move file point to the begging of bitmap data
    fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);

    //allocate enough memory for the bitmap image data
    bitmapImage = (unsigned char*)malloc(bitmapInfoHeader->biSizeImage);

    //verify memory allocation
    if (!bitmapImage)
    {
        free(bitmapImage);
        fclose(filePtr);
        return NULL;
    }

    //read in the bitmap image data
    fread(bitmapImage,bitmapInfoHeader->biSizeImage,filePtr);

    //make sure bitmap image data was read
    if (bitmapImage == NULL)
    {
        fclose(filePtr);
        return NULL;
    }

    //swap the r and b values to get RGB (bitmap is BGR)
    for (imageIdx = 0,imageIdx < bitmapInfoHeader->biSizeImage;imageIdx+=3)
    {
        tempRGB = bitmapImage[imageIdx];
        bitmapImage[imageIdx] = bitmapImage[imageIdx + 2];
        bitmapImage[imageIdx + 2] = tempRGB;
    }

    //close file and return bitmap iamge data
    fclose(filePtr);
    return bitmapImage;
}

Total, la base de leer datos de un fichero es muy fácil. Solo necesitas la documentación de la estructura en cuestión, y hacer el struct correcto...

Pero también necesitas controlar la memoria y hacer un buen uso de ella. El ejemplo puesto es muy bestia, en la mayoria de casos (por ejemplo, no cargaras un video completo en memoria, y la estructura de datos de un video puede ser mucho más compleja)

En fin, me he explicado fatal...

Pero el dia que te toque reorganizar la estructura de un video porque el programa que codifica los videos hace el trabajo a un nivel extremadamente básico y pobre, me lo agradecerás Smile
[align=center]Y mientras, en SobreLoQueOpinar...

[b]Análisis: Metroid Prime 3: Corruption
Cita
Hostias, no entiendo ni papa de ese codigo xD
Joder pues se podrian explicar mejor en clase macho, segun las transparencias

"Para leer incluyendo espacios en blanco se usa la funcion getline(cin, cadena), que guarda en la cadena los datos leidos hasta fin de linea (intro)"
Asi no se aclara uno
[Imagen: ifar.png]


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)