📜  C 中的 scanf() 和 fscanf()(1)

📅  最后修改于: 2023-12-03 14:39:41.372000             🧑  作者: Mango

C 中的 scanf() 和 fscanf()

C 语言中的输入函数 scanf()fscanf() 用于从标准输入流和文件流中读取数据。本文将介绍这两个函数的使用方法、用法的注意事项和示例代码。

scanf() 函数

scanf() 函数是从标准输入流中读取数据的函数,其函数原型如下:

int scanf(const char *format, ... );

函数参数 format 是格式化字符串,指定了所要读取的数据类型及其格式,可以包含空格和换行符。除 format 以外的参数是所要读取的数据的指针,可以是变量名、数组名或指针等形式。函数会按照指定的格式读取输入流中的数据,并将它们存储在相应的变量或数组中。

需要注意的是,scanf() 函数在读取数据时会留下输入缓冲区中的换行符,如果后续使用 gets() 函数或者 fgets() 函数可能会读取到不正确的数据。为避免出现此类问题,可以使用额外的 getchar() 函数读取掉缓冲区中的换行符。例如:

char ch;
scanf("%c", &ch);
getchar();

下面是一个简单的 scanf() 函数的示例代码:

#include <stdio.h>

int main()
{
    int a, b;
    float c;
    printf("Please enter an integer:");
    scanf("%d", &a);
    printf("Please enter another integer and a float number:");
    scanf("%d %f", &b, &c);
    printf("a=%d, b=%d, c=%.2f\n", a, b, c);
    return 0;
}
fscanf() 函数

fscanf() 函数是从文件流中读取数据的函数,与 scanf() 函数的参数和使用方法类似,只不过需要指定读取的文件流的指针。

其函数原型如下:

int fscanf(FILE *stream, const char *format, ...);

stream 参数是文件指针,指向要读取的文件流。其他参数同样是格式化字符串和数据指针。

使用 fscanf() 函数时需要注意的是,如果文件中的数据与格式化字符串不对应,可能会导致读取的数据不正确或者出错。因此,对于复杂的读取内容与格式之间的对应关系,需要进行特殊的处理。

下面是一个简单的 fscanf() 函数的示例代码:

#include <stdio.h>

int main()
{
    FILE *fp = fopen("data.txt", "r");
    if (fp == NULL)
    {
        printf("File open error!\n");
        return 0;
    }
    int count, total = 0;
    float score;
    while(fscanf(fp, "%d%f", &count, &score) != EOF)
    {
        total += count;
    }
    printf("Total=%d\n", total);
    fclose(fp);
    return 0;
}
总结

scanf()fscanf() 函数是 C 语言中常用的输入函数。它们在读取数据时需要指定格式化字符串,以便正确地读取数据。但需要注意的是,如果数据和格式化字符串不一致,则会出现错误或读取到不正确的数据。在处理复杂的格式对应关系时,需要特别小心。