繁体   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