簡體   English   中英

fscanf()。 讀取帶有C模式的文件

[英]fscanf(). Read a file with a pattern in C

我必須使用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語句。

知道我該怎么做嗎?

謝謝。

我實現了我的目標。 我有這樣的:

// 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,另一種是避免使用。 我希望它對其他任何人都有幫助。

問候。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM