0

Tengo que hacer un proyecto para una clase, se trata del juego del ahorcado, tengo las palabras con las que se va a jugar en un archivo txt, pero no se como leer una linea en especifico para poder sacar solo una palabra de todo el texto, hasta ahora tengo esto:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main() {
int menu = 0;
int numero;
int num=0;
char noman[100];
FILE* animales = fopen("animales.txt", "r");
if (animales == NULL) {
    printf("error");
}
printf("MENU DE OPCIONES\n 1.Nuevo Juego\n 2.Mejor Puntaje\n 3.Acerca De...\n 4.Salir\n");
scanf_s("%d", &menu);
int nscan = 0;

if (menu == 1) {
    num = 1 + rand() % (21 - 1);
    while (true) {
        nscan = fscanf(animales, "%15[^,], %d", noman, &numero);
        if (nscan == EOF)break;
        if (nscan != 2) printf("formato erroneo");      

    }
    system("pause");



    if (menu == 2) {


    }
    if (menu == 3) {


    }
    if (menu == 4) {



    }

    return 0;
}
      }

el archivo txt es asi:

perro,1 gato,2 vaca,3 caballo,4 ardilla,5 pato,6 lobo,7 leon,8 tigre,9 oso,10 jirafa,11 mono,12 gorila,13 armadillo,14 paloma,15 aguila,16 serpiente,17 lagarto,18 cocodrilo,19 abeja,20

como puedo seguir?

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
Carlos
  • 1
  • 5
    ¿Responde esto a tu pregunta? [Como leer una linea en especifico de un archivo en C++?](https://es.stackoverflow.com/questions/32275/como-leer-una-linea-en-especifico-de-un-archivo-en-c) – horro Dec 12 '19 at 05:36

1 Answers1

0

No se como leer una línea en especifico para poder sacar solo una palabra de todo el texto.

[…]

El archivo txt es así:

perro,1 gato,2 vaca,3 caballo,4 ardilla,5 pato,6 lobo,7 leon,8 tigre,9 oso,10 jirafa,11 mono,12 gorila,13 armadillo,14 paloma,15 aguila,16 serpiente,17 lagarto,18 cocodrilo,19 abeja,20

No es lo mismo leer una línea que leer una palabra. Menos aún si además de la palabra hay un índice anexo, que implica leer el dato y post-procesarlo para quedarnos con la palabra.

Mi consejo es que, dado que quieres elegir una palabra al azar, leas todo el archivo y elijas una palabra de entre las leídas:

std::string palabra_aleatoria(std::string ruta_a_archivo)
{
    // Abrir archivo, sólo se entra en el if si el archivo se pudo abrir.
    if (std::ifstream archivo{ruta_a_archivo})
    {
        std::vector<std::string> palabras{};
        std::string palabra{};

        // Leer todo el contenido del archivo separando por espacios,
        // guarda cada parte leída en la variable 'palabra',
        // cuando no queda contenido por leer, el while se acaba.
        while (std::getline(archivo, palabra, ' '))
        {
            // Guarda cada palabra leída en el vector de palabras.
            palabras.push_back(palabra);
        }

        // Seleccionamos una palabra aleatoria de entre todas las leídas.
        std::random_device rd;
        std::mt19937 gen(rd());
        std::uniform_int_distribution<> dis(0, palabras.size());
        palabra = palabras[dis(gen)];

        // Devolvemos la palabra quitando el número anexo a la misma.
        return palabra.substr(0, palabra.find(','));
    }
    else
        std::cout << "No se pudo abrir " << ruta_a_archivo << '\n';

    return {};
}

Puedes usar el código anterior así:

int main()
{
    auto palabra = palabra_aleatoria("animales.txt");
    return 0;
}

Puedes ver el código funcionando en Try it online!.

Otras cosas a tener en cuenta.

Etiquetas tu pregunta como peo programas como si fuera :

  • La cabecera <iostream> es exclusiva de C++ e incompatible con C.
  • Las cabeceras <stdlib.h>, <stdio.h>, <ctype.h> y <string.h> son exclusivas de C y aunque suelen ser compatibles con C++ no deben ser usadas en C++. Si necesitases usarlas (que no es el caso) deberías usar la versión adaptada a C++.
  • La cabecera <iostream> ofrece flujos de datos conectados a la consola (std::cin y std::cout) y la cabecera <stdio.h> ofrece funciones de C para comunicarse con la consola; ambas cabeceras cumplen el mismo objetivo pero sólo necesitas una: la de C++.
  • Las funciones printf, scanf_s y fscanf pertenecen a las utilidades de C, usa std::cout, std::cin y std::ofstream en su lugar.
  • FILE es una utilidad de C, en C++ se usan los flujos de lectura de archivo std::ofstream y std::ifstream.
  • rand es una utilidad imprecisa que no deberías usar pues es de C. Usa la cabecera <random> de C++.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82