📜  C语言中的scanf()和fscanf()–简单而强大

📅  最后修改于: 2021-05-25 19:15:31             🧑  作者: Mango

我们许多人都知道scanf的传统用法。好吧,这是一些鲜为人知的事实

如何只读取我们需要的部分输入?例如,考虑一些仅包含字符后跟整数或浮点数的输入流。而且我们只需要扫描那个整数或浮点数。
那是 ,
输入:“这是值100”,
输出:读取的值为100

输入:“这是值21.2”,
输出:读取的值为21.2

/* C program to demonstrate that we can
   ignore some string in scanf() */
#include 
int main()
{
    int a;
    scanf("This is the value %d", &a);
    printf("Input value read : a = %d", a);
    return 0;
}
// Input  : This is the value 100
// Output : Input value read : a = 100

现在,假设我们不知道前面的字符是什么,但是我们肯定知道最后一个值是整数。我们如何将最后一个值扫描为整数?

仅当输入字符串中没有空格时,以下解决方案才有效。

/* Sample C program to demonstrate use of *s */
#include
int main()
{
    int a;
    scanf("%*s %d", &a);
    printf("Input value read : a=%d",a);
    return 0;
}
  
// Input: "blablabla 25"
// Output: Value read : 25

说明:scanf中的%* s用于根据需要忽略某些输入。在这种情况下,它将忽略输入,直到下一个空格或换行为止。同样,如果您写入%* d,它将忽略整数,直到下一个空格或换行为止。

乍一看,上述事实似乎并不是有用的技巧。为了了解其用法,让我们首先来看fscanf()。

fscanf():厌倦了从文件中读取所有笨拙的语法?好吧,fscanf进行了救援。

int fscanf(FILE *ptr, const char *format, ...) 

fscanf从FILE指针(ptr)指向的文件中读取,而不是从输入流中读取。

考虑以下文本文件abc.txt

NAME    AGE   CITY
abc     12    hyderbad
bef     25    delhi
cce     65    bangalore  

现在,我们只想读取上述文本文件的city字段,而忽略所有其他字段。将fscanf和上面提到的技巧结合起来可以轻松实现此目的

/*c program demonstrating fscanf and its usage*/
#include
int main()
{
    FILE* ptr = fopen("abc.txt","r");
    if (ptr==NULL)
    {
        printf("no such file.");
        return 0;
    }
  
    /* Assuming that abc.txt has content in below
       format
       NAME    AGE   CITY
       abc     12    hyderbad
       bef     25    delhi
       cce     65    bangalore */
    char buf[100];
    while (fscanf(ptr,"%*s %*s %s ",buf)==1)
        printf("%s\n", buf);
  
    return 0;
}

输出:

CITY
hyderbad
delhi
bangalore 

练习:使用fscanf计算文件中单词,字符和行的数量!

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。