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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fscanf()函数。使用C中的模式读取文件相关的知识,希望对你有一定的参考价值。

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

我有下一个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, " %[^ ], %[^ ], %[^
]",buffer1,buffer2,&d) != NULL) {
        printf("%s %s %i 
", 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, " %[^,
 ]%*c",buffer) != EOF) {
                    G:
                    if (buffer[0] == '#') {
                        fscanf(fichero, " %[^
]",buffer);
                        printf("


# %s 

", 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("
");
                                contadorCamposLinea = 0;
                                goto G;
                            }
                        }
                    }
                }

                printf("


");
                fclose(fichero);
            }

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

            if ((fichero = fopen("./files/carreteras.txt", "r")) != NULL) {
                while (fscanf(fichero, " %[^,
 ]%*c",buffer) != EOF) {
                    if (buffer[0] == '#') {
                        fscanf(fichero, " %[^
]",buffer);
                        printf("


# %s 

", 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
", buffer); // PESO
                                contadorCamposLinea = 0;
                            }
                        }
                    }
                }
                fclose(fichero);
            }

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

问候。

以上是关于fscanf()函数。使用C中的模式读取文件的主要内容,如果未能解决你的问题,请参考以下文章

请问C语言对文件的读取都有哪些函数,都有啥功能?像fseek();fscanf();fread......啥的

从C中的文本文件读取int值

C语言文件怎样读取双引号中的字符串

C 语言文件操作 (fscanffprintf 函数)

C中的fscanf - 如何确定逗号?

fscanf()函数的高级用法