fscanf()函数。使用C中的模式读取文件

时间:2018-05-22 19:41:58

标签: c file pattern-matching scanf

我必须使用scanf读取txt文件并在控制台中显示内容。用scanf做这件事是必要的。在输出中也应该省略#行。

我有下一个txt文件:

# Lista ciudades

Coruña, Vigo, Valladolid, Oviedo, Bilbao, Zaragoza, Gerona, Barcelona, Madrid, Badajoz, Albacete, Valencia, Murcia, Jaén, Sevilla, Granada, Cádiz


# Distancias entre ciudades

Coruña Vigo 171
Coruña Valladolid 455
Vigo Valladolid 356
Valladolid Bilbao 280
Valladolid Madrid 193
Oviedo Bilbao 304
Bilbao Madrid 395
Bilbao Zaragoza 324
Madrid Zaragoza 325
Zaragoza Barcelona 296
Barcelona Gerona 100
Valencia Barcelona 349
Madrid Badajoz 403
Madrid Jaén 335
Madrid Albacete 251
Albacete Valencia 191
Albacete Murcia 150
Murcia Granada 284
Murcia Valencia 241
Granada Jaén 99
Granada Sevilla 256
Jaén Sevilla 242
Sevilla Cádiz 125

所需的输出是:

Coruña Vigo Valladolid Oviedo Bilbao Zaragoza Gerona Barcelona Madrid Badajoz Albacete Valencia Murcia Jaén Sevilla Granada Cádiz

Coruña Vigo 171
Coruña Valladolid 455
Vigo Valladolid 356
Valladolid Bilbao 280
Valladolid Madrid 193
Oviedo Bilbao 304
Bilbao Madrid 395
Bilbao Zaragoza 324
Madrid Zaragoza 325
Zaragoza Barcelona 296
Barcelona Gerona 100
Valencia Barcelona 349
Madrid Badajoz 403
Madrid Jaén 335
Madrid Albacete 251
Albacete Valencia 191
Albacete Murcia 150
Murcia Granada 284
Murcia Valencia 241
Granada Jaén 99
Granada Sevilla 256
Jaén Sevilla 242
Sevilla Cádiz 125

为实现这一目标,我想的是:

contadorAlmoadillas = 0;
if ((fichero = fopen("./files/carreteras.txt", "r")) != NULL) {
    // If contadorAlmoadillas is 1
    while (fscanf(fichero, " %[^,]",buffer) != NULL) {
        printf("%s ", buffer);
    }
    // If contadorAlmoadillas is 2
    while (fscanf(fichero, " %[^ ], %[^ ], %[^\n]",buffer1,buffer2,&d) != NULL) {
        printf("%s %s %i \n", buffer1,buffer2,d);
    }
    fclose(fichero);
}

但我没有得到理想的输出。这是由于scanf模式。

另外,我现在知道如何计算出#个字符的次数,所以我无法实现if语句。

知道我该怎么办?

谢谢。

1 个答案:

答案 0 :(得分:0)

我达到了我的目的。我有它像:

// WAY 1
            int contadorAlmoadillas = 0;
            int contadorCamposLinea = 0;

            if ((fichero = fopen("./files/carreteras.txt", "r")) != NULL) {
                while (fscanf(fichero, " %[^,\n ]%*c",buffer) != EOF) {
                    G:
                    if (buffer[0] == '#') {
                        fscanf(fichero, " %[^\n]",buffer);
                        printf("\n\n\n# %s \n\n", buffer); // CABECERA
                        contadorAlmoadillas++;
                    } else {
                        // # Lista ciudades
                        if (contadorAlmoadillas == 1) {
                            printf("%s ", buffer); // CIUDAD
                        // # Distancias entre ciudades
                        } else if (contadorAlmoadillas == 2) {
                            if (contadorCamposLinea < 3) {
                                printf("%s ", buffer); // NODO1 Y NODO2 Y PESO
                                contadorCamposLinea++;
                            } else {
                                printf("\n");
                                contadorCamposLinea = 0;
                                goto G;
                            }
                        }
                    }
                }

                printf("\n\n\n");
                fclose(fichero);
            }

// WAY 2
            int contadorAlmoadillas = 0;
            int contadorCamposLinea = 0;

            if ((fichero = fopen("./files/carreteras.txt", "r")) != NULL) {
                while (fscanf(fichero, " %[^,\n ]%*c",buffer) != EOF) {
                    if (buffer[0] == '#') {
                        fscanf(fichero, " %[^\n]",buffer);
                        printf("\n\n\n# %s \n\n", buffer); // CABECERA
                        contadorAlmoadillas++;
                    } else {
                        // # Lista ciudades
                        if (contadorAlmoadillas == 1) {
                            printf("%s ", buffer); // CIUDAD
                        // # Distancias entre ciudades
                        } else if (contadorAlmoadillas == 2) {
                            if (contadorCamposLinea < 2) {
                                printf("%s ", buffer); // NODO1 Y NODO2
                                contadorCamposLinea++;
                            } else {
                                printf("%s\n", buffer); // PESO
                                contadorCamposLinea = 0;
                            }
                        }
                    }
                }
                fclose(fichero);
            }

两种方式都相同,一种使用TAG,另一种避免使用。我希望它对任何人都有帮助。

问候。