[Hilo Oficial] Esto también es otro arte...el ARTE de programar - Versión para impresión +- 33bits (https://33bits.net/foro) +-- Foro: Temas de debate (https://33bits.net/foro/Foro-Temas-de-debate) +--- Foro: Off Topic (https://33bits.net/foro/Foro-Off-Topic) +--- Tema: [Hilo Oficial] Esto también es otro arte...el ARTE de programar (/Tema-Hilo-Oficial-Esto-tambi%C3%A9n-es-otro-arte-el-ARTE-de-programar) |
Re:Esto también es otro arte...el ARTE de programar - ifar B - 07-05-2013 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); 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 Re:Esto también es otro arte...el ARTE de programar - thewazaa - 07-05-2013 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 Re:Esto también es otro arte...el ARTE de programar - ifar B - 07-05-2013 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 Re:Esto también es otro arte...el ARTE de programar - thewazaa - 07-05-2013 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/basic_istream/getline Re:Esto también es otro arte...el ARTE de programar - RGBCYMK - 07-05-2013 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. Re:Esto también es otro arte...el ARTE de programar - ifar B - 07-05-2013 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┬á RGBCYMK, con el '\n' en vez del '.' peta la lectura Re:Esto también es otro arte...el ARTE de programar - RGBCYMK - 07-05-2013 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++ Re:Esto también es otro arte...el ARTE de programar - ifar B - 07-05-2013 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┬á Ya me estoy viendo que en la tutoria del jueves me voy a tirar 1 hora para que no me acabe resolviendo el problema Re:Esto también es otro arte...el ARTE de programar - thewazaa - 07-05-2013 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. Re:Esto también es otro arte...el ARTE de programar - ifar B - 07-05-2013 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 Re:Esto también es otro arte...el ARTE de programar - thewazaa - 07-05-2013 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) Esto es el header del bmp. Ancho, alto, colores, etc. Código: #pragma pack(push, 1) 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) 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 Re:Esto también es otro arte...el ARTE de programar - ifar B - 07-05-2013 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 |