Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Error al compilar en C++ (archivos)

Estas en el tema de Error al compilar en C++ (archivos) en el foro de C/C++ en Foros del Web. Código: /** Operaciones de lectura de archivos Para abrir un archivo y realizar operaciones de lectura se crea un objeto de la clase ifstream. Después ...
  #1 (permalink)  
Antiguo 30/10/2015, 15:34
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 5 meses
Puntos: 5
Pregunta Error al compilar en C++ (archivos)

Código:
/**
Operaciones de lectura de archivos

Para abrir un archivo y realizar operaciones de lectura
se crea un objeto de la clase ifstream. Después de abrir
el archivo se puede leer su contenido utilizando las funciones
miembro de la clase ifstream o bién el operador de extracción.
Cuando se lee un archivo, por lo general se empieza al principio
del mismo y se leerá su contenido hasta que se encuentre
el final del archivo. Para determinar si se ha llegado al
final del archivo se puede utilizar la función miembro eof
como condición de un bucle while. Además se puede utilizar
la función miembro fail para detectar un error al abrir el
archivo, esto se demuestra en el siguiente programa:


*/

#include <fstream.h>

int main()
{
    ifstream archivo("Pruebas.txt", ios::noreplace);
    char linea[128];
    long contador = 0L;

    if(archivo.fail())
    cerr << "Error al abrir el archivo Pruebas.txt" << endl;
    else
    while(!archivo.eof())
    {
        archivo.getline(linea, sizeof(linea));
        cout << linea << endl;
        if((++contador % 24)==0)
        {
            cout << "CONTINUA...";
            cin.get();
        }
    }
    archivo.close();
    return 0;
}
Estoy aprendiendo y encontré ese pedazo para ver, pero no compila, alguien sabe la razón?.
  #2 (permalink)  
Antiguo 30/10/2015, 16:00
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: Error al compilar en C++ (archivos)

1-
Código C++:
Ver original
  1. #include <fstream>
  2.    #include <iostream>
  3.    using namespace std;
en vez de #include <fstream.h>
2-ios::noreplace no llegó a formar parte del estándar de c++ pon en un su lugar ios::in

Con esos cambios debería compilarte sin problemas.
  #3 (permalink)  
Antiguo 30/10/2015, 16:13
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: Error al compilar en C++ (archivos)

Cita:
Iniciado por xKuZz Ver Mensaje
1-
Código C++:
Ver original
  1. #include <fstream>
  2.    #include <iostream>
  3.    using namespace std;
en vez de #include <fstream.h>
2-ios::noreplace no llegó a formar parte del estándar de c++ pon en un su lugar ios::in

Con esos cambios debería compilarte sin problemas.
Hola, gracias hermano.
Estoy aprendiendo y haciendo mi primer programa con ficheros.

Permiteme hacerte una pregunta sobre esto:
ifstream archivo("Pruebas.txt", ios::in);

por qué el escribe "archivo" después de "ifstream"?.
No puede ser esto:
ifstream ("Pruebas.txt", ios::in);

porque el documento se llamará Prueba y no archivo, o hay alguna razon para hacer eso?.
  #4 (permalink)  
Antiguo 30/10/2015, 16:29
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Error al compilar en C++ (archivos)

Cita:
Iniciado por RGT Ver Mensaje
Permiteme hacerte una pregunta sobre esto:
ifstream archivo("Pruebas.txt", ios::in);

por qué el escribe "archivo" después de "ifstream"?.
No puede ser esto:
ifstream ("Pruebas.txt", ios::in);

porque el documento se llamará Prueba y no archivo, o hay alguna razon para hacer eso?.
si yo te pongo:

Código C++:
Ver original
  1. int numero(4);

y te digo que es equivalente a

Código C++:
Ver original
  1. int numero = int(4);

o, como quizás estás más acostumbrado a verlo:

Código C++:
Ver original
  1. int numero = 4;

¿Se ve mejor?

archivo es el nombre de la variable. En este caso la variable representa un objeto de tipo ifstream. Si la variable no tuviese nombre entonces no podrías acceder a ella porque... ¿qué identificador usas para referirte a algo que no tiene identificador?

Un saludo.
  #5 (permalink)  
Antiguo 30/10/2015, 16:30
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: Error al compilar en C++ (archivos)

ifstream es la clase de c++ que maneja entrada de archivos.
Si quisieras modo salida utilizas ofstream o si quieres modo mixto utilizas fstream

El nombre archivo es el que identifica a la instancia de la clase, puedes llamarlo cómo quieras y eso sólo afectará a como lo llames después en tu código. Es como si tu escribes int a=0; en ese caso a hace referencia a una dirección de memoria donde se guarda un entero y es 0, pues si tu llamas archivo al ifstream hace lo mismo pero para dicha clase, es un nombre de variable (más correctamente nombre de instancia de la clase ifstream).

Ahora bien hemos llamado al constructor con dos argumentos. El primer argumento es la ruta del archivo en el que vamos a trabajar y el segundo el modo de apertura.

ios::in no es necesario siquiera ponerlo ya que ifstream implica esto, es decir si hubiese hecho el constructor con un solo argumento hubiese hecho lo mismo, pero si hubieses hecho un fstream y le hubieses puesto ios::in eso indica que lo has abierto en modo de sólo lectura. Análogamente ios::out indica que lo has abierto en modo de escritura. Existen bastantes más opciones, estas dos son por poner un ejemplo.
  #6 (permalink)  
Antiguo 30/10/2015, 16:55
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 5 meses
Puntos: 5
Pregunta Respuesta: Error al compilar en C++ (archivos)

Hola,
Gracias por la explicacion.

Tengo mas dudas, si me lo permiten.
El punto es que en la universidad me enviaron a programar el juego de EL AHORCADO, lo malo es que nunca he trabajado con ficheros, y no se ni la pepa.

Sigo investigado y leyendo en Google.

Tengo esto:
Código:
int main()
{
    int NumeroLetras;

    cout << "Juego de El Ahorcado\n--------------------\n" << endl;

    cout << "N\243mero de letras de la palabra: ";
    cin >> NumeroLetras;

/*                Abrimos el fichero para su lectura
------------------------------------------------------------------------*/
    ifstream archivo("palabras.txt");

/*                Qué pasa si el fichero no pudo abrirse?
------------------------------------------------------------------------*/
    if (archivo.fail())
        cout << "\n\tError!, no se ha podido abrir el archivo." << endl;

    return 0;
}
palabras.txt
Código:
baloncesto
beisbol
futbol
golf
rugby
tenis
boxeo
sumo
judo
nascar
atletismo
caminata
ciclismo
esgrima
natacion
polo
clavados
remo
vela
Preguntas:
1. Cómo leo las líneas del fichero para buscar una palabra que tenga la cantidad de letras que el usuario pide?.
2. Cómo hago para saber si no existen palabras con esa cantidad de letras?.
3. etc....

No sé nada, soy totalmente nuevo en esto. Si pudieran orientarme un poco mas seria grandioso.

Última edición por RGT; 30/10/2015 a las 17:07
  #7 (permalink)  
Antiguo 31/10/2015, 05:30
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Error al compilar en C++ (archivos)

Tienes que ir leyendo palabra por palabra y comprobar su largo hasta dar con la deseada. Seria mejor tener un archivo para cada largo y dependiendo del largo deseado abres uno u otro. Otro problema es que si quisieras elegir una palabra del archivo al azar y no son todas del mismo largo seria algo más complejo moverse con seekw y tell y si lo haces como digo la cosa se facilita mucho.
De la otra manera tendrías que obtener el tamaño del archivo, luego usando ese rango obtienes un valor al azar y te posicionas en el, luego vas comprobando si el carácter es un salto de línea y si no es asi retrocedes hasta dar con 1 o hasta que llegues al inicio del archivo y ya puedes usar getline para leer la palabra.
  #8 (permalink)  
Antiguo 31/10/2015, 11:29
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: Error al compilar en C++ (archivos)

Cita:
Iniciado por aguml Ver Mensaje
Tienes que ir leyendo palabra por palabra y comprobar su largo hasta dar con la deseada. Seria mejor tener un archivo para cada largo y dependiendo del largo deseado abres uno u otro. Otro problema es que si quisieras elegir una palabra del archivo al azar y no son todas del mismo largo seria algo más complejo moverse con seekw y tell y si lo haces como digo la cosa se facilita mucho.
De la otra manera tendrías que obtener el tamaño del archivo, luego usando ese rango obtienes un valor al azar y te posicionas en el, luego vas comprobando si el carácter es un salto de línea y si no es asi retrocedes hasta dar con 1 o hasta que llegues al inicio del archivo y ya puedes usar getline para leer la palabra.
Hola, gracias por ayudarme.

El problema aqui es que NUNCA HE TRABAJADO CON FICHEROS. No se hacer nada de lo que dijiste.
  #9 (permalink)  
Antiguo 31/10/2015, 13:00
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: Error al compilar en C++ (archivos)

Tienes una referencia completa sobre todas las funciones que puedes utilizar (en inglés) en:
http://www.cplusplus.com/reference/f...asic_ifstream/.

1. Como en tu archivo cada linea indica una palabra linea a linea lo metes es una cadena de caracteres (ya sea char* o std::string) y miras su longitud.

2. Si tu ifstream se llama archivo, la función archivo.eof() te devuelve true si se ha alcanzado el final del archivo. En caso de que esto ocurra puedes asumir con total seguridad que no hay ninguna palabra con el tamaño deseado.

Yo te voy a poner un ejemplo en el que cojo la primera palabra que encuentro con klongitud letras y la muestro por pantalla. Espero que te sirva de referencia para lo que necesitas hacer. Si no quieres que siempre te salga la primera palabra siempre, tendrás que meterlo en un array-C o en un std::vector si te permiten utilizarlo y sacar una de las palabras de longitud X aleatoriamente.

Código C++:
Ver original
  1. #include <fstream>
  2. #include <iostream>
  3. using namespace std;
  4. int main(){
  5.     ifstream archivo;
  6.     string palabra;
  7.     bool buscando=true; // Para salir del while cuando lo encuentre
  8.     const int klongitud=5; // Longitud de la palabra a encontrar
  9.  
  10.     archivo.open("palabras.txt");
  11.  
  12.     while (buscando){
  13.         if (archivo.eof()) {
  14.             buscando=false;
  15.             cout << "No hay ninguna palabra de " << klongitud << " letras.\n";
  16.         }
  17.         else {
  18.             getline(archivo,palabra);
  19.             if(palabra.size()==klongitud){
  20.                 buscando=false;
  21.                 cout << palabra << " es una palabra de " << klongitud <<  " letras.\n";
  22.             }
  23.         }
  24.     }
  25.     archivo.close();
  26.  
  27. }
  #10 (permalink)  
Antiguo 31/10/2015, 14:43
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: Error al compilar en C++ (archivos)

Cita:
Iniciado por xKuZz Ver Mensaje
Tienes una referencia completa sobre todas las funciones que puedes utilizar (en inglés) en:
http://www.cplusplus.com/reference/f...asic_ifstream/.

1. Como en tu archivo cada linea indica una palabra linea a linea lo metes es una cadena de caracteres (ya sea char* o std::string) y miras su longitud.

2. Si tu ifstream se llama archivo, la función archivo.eof() te devuelve true si se ha alcanzado el final del archivo. En caso de que esto ocurra puedes asumir con total seguridad que no hay ninguna palabra con el tamaño deseado.

Yo te voy a poner un ejemplo en el que cojo la primera palabra que encuentro con klongitud letras y la muestro por pantalla. Espero que te sirva de referencia para lo que necesitas hacer. Si no quieres que siempre te salga la primera palabra siempre, tendrás que meterlo en un array-C o en un std::vector si te permiten utilizarlo y sacar una de las palabras de longitud X aleatoriamente.

Código C++:
Ver original
  1. #include <fstream>
  2. #include <iostream>
  3. using namespace std;
  4. int main(){
  5.     ifstream archivo;
  6.     string palabra;
  7.     bool buscando=true; // Para salir del while cuando lo encuentre
  8.     const int klongitud=5; // Longitud de la palabra a encontrar
  9.  
  10.     archivo.open("palabras.txt");
  11.  
  12.     while (buscando){
  13.         if (archivo.eof()) {
  14.             buscando=false;
  15.             cout << "No hay ninguna palabra de " << klongitud << " letras.\n";
  16.         }
  17.         else {
  18.             getline(archivo,palabra);
  19.             if(palabra.size()==klongitud){
  20.                 buscando=false;
  21.                 cout << palabra << " es una palabra de " << klongitud <<  " letras.\n";
  22.             }
  23.         }
  24.     }
  25.     archivo.close();
  26.  
  27. }
Hola hermano, gracias por tratar de ayudarme.
Si no te molesta, tengo algunas dudas con tu codigo.

1. Para qué sirve "getline(archivo,palabra);". Por qué pones "archivo" primero y luego "palabra" al final?.
2. "palabra.size()". Esta funcion llamada .size(), me entrega la cantidad de letras que tiene una palabra?. Ejemplo: carro, tiene 5 letras.
3. Por qué usaste "archivo.open("palabras.txt");" y no "ifstream fichero("palabras.txt");". Cuál es la diferencia con el .open().

Espero puedas ayudarme hermano, creo que voy entendiendo poco a poco.
  #11 (permalink)  
Antiguo 31/10/2015, 15:10
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: Error al compilar en C++ (archivos)

1. Ese getline es específico para std::string.

En ese caso tienes varias formas de llamarlo

a) getline(istream &is, string &str, char delim)
donde is es el flujo de entrada (cin o un ifstream, como en nuestro caso archivo)
donde str es un std::string en el que se almacena todo lo que recoge la función.
delim es el carácter que nos indica que paremos.

b) getline(istream &is, string& str)
Esta es la que he utilizado.
Igual que antes, indico el flujo de entrada y donde vamos a almacenar la línea.
En este caso se presupone que \n es el carácter delimitador. Por tanto va a coger del punto donde vayas en el flujo de entrada ifstream archivo, y la secuencia de caracteres hasta encontrar '\n' (salto de línea) la va a almacenar en el string palabra.

Referencia de la función (Inglés): http://www.cplusplus.com/reference/s...tring/getline/

2- Sí, string::size te devuelve el tamaño del string, es decir el número de caracteres que ocupa. Ojo: los espacios en blanco también son carácteres si hubiese un espacio en blanco antes del salto de línea contaría como una palabra con más letras como espacios extras.

Referencia de la función (Inglés): http://www.cplusplus.com/reference/string/string/size/

3-Porque cogí un trozo de código y lo adapté para el ejemplo y estaba puesto así. Si llamas a ifstream archivo("archivo.txt") eso implica crear la variable archivo y hacer el open de archivo.txt. Puedes utilizar la forma que veas más conveniente.

Referencia de la función (Inglés): http://www.cplusplus.com/reference/f...ream/ifstream/
Referencia de la función (Inglés): http://www.cplusplus.com/reference/f...ifstream/open/

  #12 (permalink)  
Antiguo 02/11/2015, 10:38
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: Error al compilar en C++ (archivos)

Hola, gracias por ayudarme.

Estoy probando con lo que me mostraste pero al compilarlo me da error.
Puedes ayudarme a saber el por qué?

Código:
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    int NumeroLetras;

    cout << "Juego de El Ahorcado\n--------------------\n" << endl;

    cout << "N\243mero de letras de la palabra: ";
    cin >> NumeroLetras;

/*                Creamos el fichero con las palabras a adivinar
------------------------------------------------------------------------*/
    ofstream fichero("palabras.txt");
    fichero << "baloncesto\n";
    fichero << "beisbol\n";
    fichero << "futbol\n";
    fichero << "golf\n";
    fichero << "rugby\n";
    fichero << "tenis\n";
    fichero << "boxeo\n";
    fichero << "sumo\n";
    fichero << "judo\n";
    fichero << "nascar\n";
    fichero << "atletismo\n";
    fichero << "caminata\n";
    fichero << "ciclismo\n";
    fichero << "esgrima\n";
    fichero << "natacion\n";
    fichero << "polo\n";
    fichero << "clavados\n";
    fichero << "remo\n";
    fichero << "vela\n";
    fichero << "ajedrez\n";
    fichero.close();

/*                Determinamos el tamaño de las palabras
------------------------------------------------------------------------*/
    string Palabra;

    fichero.open("palabras.txt");

    while (! fichero.eof())
    {
        getline(fichero, Palabra);

        cout << Palabra.size() << endl;
    }

    return 0;
}
Recibo error con esto "getline(fichero, Palabra);" y no se por qué....
  #13 (permalink)  
Antiguo 02/11/2015, 11:02
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Error al compilar en C++ (archivos)

Por qué quieres usar un ofstream es decir, un stream de escritura, para leer?

  • los streams de salida son únicamente para escribir
  • los streams de entrada son únicamente para leer
  • los streams de entrada/salida se pueden utilizar tanto para leer como para escribir
  #14 (permalink)  
Antiguo 02/11/2015, 11:07
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: Error al compilar en C++ (archivos)

Cita:
Iniciado por eferion Ver Mensaje
Por qué quieres usar un ofstream es decir, un stream de escritura, para leer?

  • los streams de salida son únicamente para escribir
  • los streams de entrada son únicamente para leer
  • los streams de entrada/salida se pueden utilizar tanto para leer como para escribir
Hola hermano.
hice estos cambios entonces:

Código:
    string Palabra;

    ifstream fichero("palabras.txt");

    while (! fichero.eof())
    {
        getline(fichero, Palabra);

        cout << Palabra << endl;
    }

    fichero.close();
y ahora recibo error en esta linea "ifstream fichero("palabras.txt");", podrias ayudarme a encontrar mi problema?, todavia no entiendo mucho todo este rollo...
  #15 (permalink)  
Antiguo 02/11/2015, 11:29
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Error al compilar en C++ (archivos)

En serio, tienes que aprender a leer y entender los mensajes de error.

No puedes tener dos variables que se llamen igual en el mismo ámbito.
  #16 (permalink)  
Antiguo 02/11/2015, 13:12
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: Error al compilar en C++ (archivos)

Hola, gracias por tu ayuda hermano.

Hasta ahora tengo esto:
Código:
#include <iostream>
#include <fstream>  // Librería para el manejo de archivos
#include <string>

using namespace std;

int main()
{
    int NumeroLetras, Score = 0;
    string Nombre;

    cout << "Juego de El Ahorcado\n--------------------\n" << endl;

    cout << "Escribe tu nombre: ";
    cin >> Nombre;

    cout << "N\243mero de letras de la palabra: ";
    cin >> NumeroLetras;

/*                Creamos el fichero con las palabras a adivinar
------------------------------------------------------------------------*/
    fstream fichero;

    cout << "\nCreando fichero con palabras..." << endl;
    fichero.open("palabras.txt", ios::out);
    fichero << "baloncesto\n";
    fichero << "beisbol\n";
    fichero << "futbol\n";
    fichero << "golf\n";
    fichero << "rugby\n";
    fichero << "tenis\n";
    fichero << "boxeo\n";
    fichero << "sumo\n";
    fichero << "judo\n";
    fichero << "nascar\n";
    fichero << "atletismo\n";
    fichero << "caminata\n";
    fichero << "ciclismo\n";
    fichero << "esgrima\n";
    fichero << "natacion\n";
    fichero << "polo\n";
    fichero << "clavados\n";
    fichero << "remo\n";
    fichero << "vela\n";
    fichero << "ajedrez";
    fichero.close();
    cout << "Fichero creado exitosamente..." << endl;

/*                Encontramos la palabra de x letras
------------------------------------------------------------------------*/
    string Palabra;
    bool Encontrada = true;

    fichero.open("palabras.txt", ios::in);

    while (Encontrada)
    {
        if (fichero.eof())
        {
            Encontrada = false;
            cout << "No hay palabras de " << NumeroLetras << " letras en el juego..." << endl;
        }

        else
        {
            getline(fichero, Palabra);

            if (Palabra.size() == NumeroLetras)
            {
                Encontrada = false;
                cout << "Palabra de " << NumeroLetras << " letras encontrada..." << endl;
            }
        }
    }

    fichero.close();

/*                Guardamos la configuración en otro fichero
------------------------------------------------------------------------*/
    fstream configuracion;

    cout << "\nGuardando configuraci\242n en otro fichero..." << endl;
    configuracion.open("configuracion.txt", ios::out);
    configuracion << Nombre << endl;
    configuracion << Palabra << endl;
    configuracion << Score;
    configuracion.close();
    cout << "Fichero creado exitosamente..." << endl;

    return 0;
}
Te comento que el punto de este programa es reproducir el juego de El Ahorcado.
  1. Guardar la puntuación en un archivo para compararla con las futuras puntuaciones, o sea, debo programar algo que lleve las puntuaciones. El menor número de intentos.
  2. Si una segunda persona intenta jugar, y elige 4 letras, el programa no puede seleccionar la primera palabra que tenga 4 letras si ya se ha usado antes, debe seleccionar la siguiente que tenga 4 letras.
  3. Si una letra no se ha adivinado se colocará en su posición el carácter ‘_’.
  4. En otro fichero debo tener dibujado el muñeco y debo ir imprimiendo linea por linea cada vez que el jugador falle. Solo habrá 7 posibles fallos.
  5. El juego termina cuando el jugador ha adivinado todas las letras de la palabra (en cuyo caso, se mostrará un mensaje de felicitación) o cuando el jugador haya cometido 7 fallos (mostrando el mensaje de fin de juego).

Esto es lo que debo hacer, muy fuerte para ser mi primera vez trabajando con ficheros en c++ pero, lo estoy intentando.

Trato de comprender cómo hacer lo siguiente:
  1. Cómo leer la segunda línea de un fichero?. Ej, estoy creando "configuracion.txt", en donde la primera linea es el nombre del jugador, la segunda linea es la palabra a adivinar y la tercera es la puntuación. Cómo leo una linea en especifico si quiero ejemplo mostrar la puntuación solamente al comienzo del juego?.
  2. Cómo puedo saber si una palabra de x letras ya fue jugada antes, y cómo hago para que el programa seleccione la siguiente palabra en la lista?.

Muchas dudas, repito es mi primera vez con ficheros y no entiendo como comunicar mis pensamientos en codigo.
Espero puedan ayudarme.
  #17 (permalink)  
Antiguo 03/11/2015, 08:32
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: Error al compilar en C++ (archivos)

alguien sabe?..
  #18 (permalink)  
Antiguo 03/11/2015, 08:41
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Error al compilar en C++ (archivos)

Cita:
Iniciado por RGT Ver Mensaje
1. Cómo leer la segunda línea de un fichero?. Ej, estoy creando "configuracion.txt", en donde la primera linea es el nombre del jugador, la segunda linea es la palabra a adivinar y la tercera es la puntuación. Cómo leo una linea en especifico si quiero ejemplo mostrar la puntuación solamente al comienzo del juego?.
Lee la primera, la descartas, lees otra línea y esta ya sí te la quedas.

Cita:
Iniciado por RGT Ver Mensaje
2. Cómo puedo saber si una palabra de x letras ya fue jugada antes, y cómo hago para que el programa seleccione la siguiente palabra en la lista?.
Si la lectura ha de ser secuencial, es decir, eliges una palabra para el primer juego, en el segundo juegas con la siguiente y así, tienes dos opciones: o localizas la palabra actual en el fichero y te quedas con la siguiente... o almacenas el número de fila de la palabra y pasas a leer la que se encuentre en la siguiente fila. Para esta búsqueda puedes aplicar lo comentado en el punto 1.

Si la lectura es aleatoria lo mejor es ir almacenando en un vector la lista de palabras utilizadas o la fila en la que se encuentran.
Muchas dudas, repito es mi primera vez con ficheros y no entiendo como comunicar mis pensamientos en codigo.

Un saludo
  #19 (permalink)  
Antiguo 03/11/2015, 08:49
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 5 meses
Puntos: 5
Pregunta Respuesta: Error al compilar en C++ (archivos)

Cita:
Iniciado por eferion Ver Mensaje
Lee la primera, la descartas, lees otra línea y esta ya sí te la quedas.



Si la lectura ha de ser secuencial, es decir, eliges una palabra para el primer juego, en el segundo juegas con la siguiente y así, tienes dos opciones: o localizas la palabra actual en el fichero y te quedas con la siguiente... o almacenas el número de fila de la palabra y pasas a leer la que se encuentre en la siguiente fila. Para esta búsqueda puedes aplicar lo comentado en el punto 1.

Si la lectura es aleatoria lo mejor es ir almacenando en un vector la lista de palabras utilizadas o la fila en la que se encuentran.
Muchas dudas, repito es mi primera vez con ficheros y no entiendo como comunicar mis pensamientos en codigo.

Un saludo
Hola hermano, entonces, una cosa mas que se quedo en el aire.

Cómo leer la segunda línea de un fichero? o la terchera o la linea que desée?
  #20 (permalink)  
Antiguo 03/11/2015, 09:09
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Error al compilar en C++ (archivos)

Ya te contestó a eso.
  #21 (permalink)  
Antiguo 03/11/2015, 09:19
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: Error al compilar en C++ (archivos)

Cita:
Iniciado por aguml Ver Mensaje
Ya te contestó a eso.
Hola hermano.
Te comento que solo me explicaste con palabras.
Una cosa es leer y otra cosa es que me muestres algo de código.

Te repito es mi primera vez con ficheros y no se hacer nada, he aprendido un poco con ustedes y si pregunto algo es porque realmente todavía no lo entiendo.

Si supiera no tendría por que preguntar de nuevo.
  #22 (permalink)  
Antiguo 03/11/2015, 09:43
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Error al compilar en C++ (archivos)

Ya no es cuestión de que sea tu primera vez con ficheros o no... lo que enseñas en el foro es una actitud totalmente pasiva en plan... dámelo todo hecho.

Se ve por ejemplo en la cadena de mensajes con los errores de compilación... si te hubieses parado a leer los mensajes habrías visto, por ejemplo, que getline no admite un objeto de tipo ofstream... que su firma admite únicamente ifstream, o podrías haber visto que estabas asignando a una variable un nombre que ya existe.

Solicitar ayuda en el foro puede llegar a ser una tentación demasiado grande cuando uno se atasca, pero piensa que el foro no va a estar ahí en tu día a día cuando tengas que vivir de tu código. ¿Piensas que vas a aprender si te damos el código hecho? Ya te adelanto que no... por mucho empeño que le pongas en revisar el código que colguemos no vas a aprender prácticamente nada porque luego te pondrán el mismo problema cambiando un par de detalles y te volverás a atascar... me he aburrido de ver casos así.

Otra cosa muy distinta es que ya, con un nivel razonablemente bueno, te dediques a explorar el código fuente de terceros para entender cómo han resuelto ciertos problemas... eso sí que puede resultar productivo, pero para ello se requieren ciertas habilidades que ahora mismo queda claro que no tienes.

Y todo esto no te lo digo para meterme contigo o que te sientas humillado. Nada más lejos de la realidad. Únicamente intento que veas que este no es el camino correcto si quieres aprender... ahora que si no quieres aprender y únicamente quieres que te resuelva el ejercicio te digo lo mismo que a otros... siempre puedes pedir presupuesto.

Programar cuesta?? sí, ya lo estás viendo. Y cuesta porque tienes que adaptar tu forma de pensar. Y esto se hace más evidente en lenguajes como C y C++, donde tienes que estar pendiente tanto de detalles de alto nivel como de bajo nivel.

Con respecto a tu problema obviamente no te voy a poner el código en concreto pero puedo darte una guía. Sacar el código que necesitas es algo que si te lo tomas con un mínimo de tranquilidad puedes sacarlo sin problemas. Te prometo que no es complicado.

¿Cómo descartar valores? es tan sencillo como reescribir el contenido de la variable:

Código C:
Ver original
  1. int valor = 4;
  2.  
  3. // el 4 ya no me sirve, reescribo su valor
  4. valor = 34;
  5.  
  6. // Ahora necesito que el valor me lo proporcione el usuario
  7. scanf("%d",&valor);

Seguro que eres capaz de realizar una función que lea dos líneas de un fichero y se quede únicamente con la primera... una vez tengas eso intenta generalizarlo para que la función te devuelva únicamente el contenido de una fila dada... y ya tendrás todas las herramientas necesarias para terminar tu programa.

Un saludo

Última edición por eferion; 03/11/2015 a las 09:48
  #23 (permalink)  
Antiguo 03/11/2015, 14:02
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 5 meses
Puntos: 5
Respuesta: Error al compilar en C++ (archivos)

Hola,
bueno, realmente no entiendo. Lei la documentacion de getline y no le comprendo.
Aun no se la diferencia entre get y getline y los tres elementos que lleva en () el getline. Llevo masa de 10 ejemplos en casa hecho y todos dan error.
Sigo sin poder leer la linea que deseo en un fichero y he intentado de todo.

lo siento pero no entiendo men.
gracias por ayudarme de todas formas, excusa la molestia.
  #24 (permalink)  
Antiguo 03/11/2015, 15:14
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Error al compilar en C++ (archivos)

getline (stream, buffer, delimitador);
El stream es de donde tiene que obtener la línea de texto. Por ejemplo un archivo, o cin.
Buffer es donde se guardará la línea de texto.
El delimitador es el carácter que se usará para que sepa donde parar. Normalmente es '\n' pero puedes usar el que quieras.
get se usa para obtener un solo carácter. getline se usa para obtener una cadena de caracteres.
Código C++:
Ver original
  1. ifstream archivo;
  2. string buffer;
  3. archivo.open ("texto.txt");
  4. getline (archivo,buffer,'\n');
  5. archivo.close ();
Cada vez que lees del archivo digamos que la posición se queda en la siguiente con lo que la segunda vez que llames a getline leerás la siguiente línea y así hasta el final del archivo.
Si quieres leer la segunda es tan sencillo como leer dos veces con getline. Hay formas mejores de hacerlo pero tendría que ser todas las líneas del mismo largo y te podrías desplazar con seekg y tellg que es más eficiente.
Imagina que tienes diez palabras de 5 caracteres todas. Además cada una tiene en tu caso el carácter de salto de línea. Lo primero seria posicionarse al final del archivo y obtener su posición y obtendrás 60. Si lo divides entre 6 te da que tienes 10 palabras. Ahora te posicionas al inicio del archivo y si te dijeran que vayas a la cuarta pues sabes que si envías la posición a 6*3 irías a la la cuarta palabra. ¿porque 3 y no cuatro? Porque la primera palabra estaría en la posición 0 y 6*0 es 0.

Última edición por aguml; 03/11/2015 a las 15:31

Etiquetas: char, compilar, funcion, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:59.