首页 > 解决方案 > 文件和字符串

问题描述

我需要制作一个用户选择大陆的程序。该程序将读取所选大陆的文件。然后,程序将询问所选大陆国家的首都。现在,我专注于欧洲。(该文件是西班牙语,但很好)

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

如您所见,文件未正确读取。我不知道如何将国家和首都复制到数组中。

问题已解决!我添加了 return 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

标签: cfile

解决方案


对于带空格的行,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;
}

推荐阅读