Файлы и строки - PullRequest
       2

Файлы и строки

0 голосов
/ 17 января 2020

Мне нужно сделать программу, в которой пользователь выбирает континент. Программа прочитает файл выбранного континента. Затем программа спросит столицу страны выбранного континента. Прямо сейчас я сосредоточен на Европе. (Файл на испанском sh, но в порядке)

https://i.gyazo.com/7e31966c2196455d4fd2aef1d74226e2.png

Первая строка - страна, вторая строка - столица и т. Д. , Я не очень хорош в этом. Конечно, это глупая ошибка, или я неправильно понял теорию. Код выполняется, но читает файл странным образом. Вот код:

#include <stdio.h>
#include <stdlib.h>
#define N 33
int Europa(char EuropaP[N][N], char EuropaC[N][N]);
//int Asia();
FILE *eu;
FILE *as;

int main()
{
    int p1, salir;
    char EuropaP[N][N];
    char EuropaC[N][N];
    while(salir != 0)
    {
        printf("-----MENU PRINCIPAL-----\n"); //main menu where the users selects the continent.
        printf("Elige un continente\n\n");
        printf("1. Europa\n");
        printf("2. Asia\n");
        printf("\nEscribe 0 para salir");
        printf("\nSeleccion: ");
        scanf("%d", &p1);
        if (p1 == 1)
        {
            Europa(EuropaP, EuropaC);
        }
        else if (p1 == 2)
        {
            //Asia();
        }
        else
            fclose(eu);
            //fclose(as);
        break;

    }
    return 0;
}
int Europa(char EuropaP[N][N], char EuropaC[N][N])
{
    int vida, c, i;
    eu = fopen("Europa.txt", "r");
    if (eu == NULL){
        printf("No se ha abierto correctamente el fichero");
    }
    else
        for(i=0; i<33; i++)
        {
            fscanf(eu, "%s\n%s", EuropaP[i], EuropaC[i]);
        }
    for(c=0; c<33; c++)
    {
        printf("%s\n%s", EuropaP[c], EuropaC[c]);
        printf("\n");
    }


}

Пример выполнения:

https://i.imgur.com/UUR5kxl.png

Как видите, файл не читается правильно , Я не знаю, как скопировать страны и столицы в массив.

ПРОБЛЕМА ИСПРАВЛЕНА! Я добавил возврат 0; здесь:

if (eu == NULL){
    printf("No se ha abierto correctamente el fichero");
    return 0;
}

изменил каталог файла .txt:

int Europa(char EuropaP[N][N], char EuropaC[N][N])
{
    int vida, c, i;
    eu = fopen("/Users/****/Desktop/Europa.txt", "r");

и, наконец, я использую fgets вместо fscanf.

else
    for(i=0; i<N; i++)
    {
        fgets(EuropaP[i], N, eu);
        fgets(EuropaC[i], N, eu);
    }
for(c=0; c<N; c++)
 printf("%s\n%s", EuropaP[c], EuropaC[c]);
    printf("\n");

Пример исполнения https://i.gyazo.com/d009ed7d36ef47d067dc9d4af806e077.png

1 Ответ

1 голос
/ 17 января 2020

Для строк с пробелами fgets будет работать. Новая строка может быть удалена с помощью strcspn.

int Europa(char EuropaP[N][N], char EuropaC[N][N])
{
    int vida, c, i;
    eu = fopen("Europa.txt", "r");
    if (eu == NULL){
        printf("No se ha abierto correctamente el fichero");
        return 0;
    }
    for(i=0; i<33; i++)
    {
        if ( ! fgets ( EuropaP[i], N, eu)) {
            printf ( "fgets EOF\n");
            return 0;
        }
        EuropaP[i][strcspn ( EuropaP[i], "\r\n")] = 0;//remove newline

        if ( ! fgets ( EuropaC[i], N, eu)) {
            printf ( "fgets EOF\n");
            return 0;
        }
        EuropaC[i][strcspn ( EuropaC[i], "\r\n")] = 0;//remove newline

        printf("%s\n%s\n", EuropaP[i], EuropaC[i]);
    }
    return 1;
}

. Итерация по строке и при обнаружении возврата новой строки или возврата каретки установите ноль для завершения строки.

int Europa(char EuropaP[N][N], char EuropaC[N][N])
{
    int vida, c, i;
    int each = 0;
    eu = fopen("Europa.txt", "r");
    if (eu == NULL){
        printf("No se ha abierto correctamente el fichero");
        return 0;
    }
    for(i=0; i<33; i++)
    {
        if ( ! fgets ( EuropaP[i], N, eu)) {
            printf ( "fgets EOF\n");
            return 0;
        }
        each = 0;
        while ( EuropaP[i][each]) {
            if ( '\r' == EuropaP[i][each] || '\n' == EuropaP[i][each]) {
                EuropaP[i][each] = 0;
                break;
            }
            each++;
        }

        if ( ! fgets ( EuropaC[i], N, eu)) {
            printf ( "fgets EOF\n");
            return 0;
        } 
        each = 0;
        while ( EuropaC[i][each]) {
            if ( '\r' == EuropaC[i][each] || '\n' == EuropaC[i][each]) {
                EuropaC[i][each] = 0;
                break;
            }
            each++;
        }

        printf("%s\n%s\n", EuropaP[i], EuropaC[i]);
    }
    return 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...