【问题标题】:Reading strings, integers etc from files using fscanf使用 fscanf 从文件中读取字符串、整数等
【发布时间】:2012-07-17 14:30:47
【问题描述】:

我希望您能帮助我了解我应该如何执行以下操作:

我有一个文件,其中包含用空格“”分隔的整数。我需要读取所有整数,对它们进行排序并将它们作为字符串写入另一个文件。我写了一个代码,但是我逐个字符地读取字符,把这个词放在一个 char sub_arr [Max_Int] 中,当我遇到''时,我把这些字符,现在是一个字符串,在将它放入另一个 Main int 数组之后,直到到达文件末尾,逐个字符串,然后我对它们进行排序和 itoa-ing 并将它们写入另一个文件。

但后来我记得有一个fscanf 函数:我读过它,但我仍然不完全了解它的作用以及如何使用它。

在我的情况下,所有整数都用空格分隔,我可以写fscanf(myFile,"%s",word)吗?它会知道不考虑 ' ' 并在特定字符串的末尾停止吗?!怎么样?

不仅如此,我可以写fscanf(myFile,"%d",number) 并且它会给我下一个号码本身吗? (我一定是误会了。感觉​​就像魔法一样)。

【问题讨论】:

  • 每行的整数个数是固定的吗?
  • 有必要用C吗? Python、Perl、Ruby、Awk 等工具在这类事情上做得非常好。
  • @ziu:不,它没有,马克:是的,我正在学习 C :)
  • @Numerator:那么这是使用 C 的绝佳理由;)

标签: c string integer scanf


【解决方案1】:

以下几行将完成您的工作,以下几行将读取单个整数。

int number;
fscanf(myFile, " %d", &number);

把它放在一个循环中直到文件结束,并将数字放入数组中。

【讨论】:

    【解决方案2】:

    试试这个:

    #include <stdio.h>
    
    
    int main(int argc, char* argv[])
    {
        char name[256];
        int age;
        /* create a text file */
        FILE *f = fopen("test.txt", "w");
        fprintf(f, "Josh 25 years old\n");
        fclose(f);
    
        /* now open it and read it */
        f = fopen("test.txt", "r");
    
        if (fscanf(f, "%s %d", name, &age) !=2)
            ; /* Couln't read name and age */
        printf("Name: %s, Age %d\n", name, age);
    
    }
    

    【讨论】:

    • 这有一个问题,如果由于某种原因传递给 fscanf 的字符串中的名称大于“char name[256]”的大小,则会产生缓冲区溢出。
    • 嗯,代码 as is 没有问题,因为它指定了缓冲区的内容,而在代码中,strlen(name) 是 fscanf_s。但问题是关于 fscanf 的使用。
    【解决方案3】:

    你是对的,fscanf 可以给你下一个整数。但是,您需要为它提供一个指针。因此,您需要一个&amp; 后面的号码:

    fscanf(myFile, "%d", &number);
    

    *scanf 系列函数也会自动跳过空格(给定%c%[%n 时除外)。

    读取文件的循环最终将如下所示:

    while (you_have_space_in_your_array_or_whatever)
    {
        int number;
        if (fscanf(myFile, "%d", &number) != 1)
            break;        // file finished or there was an error
        add_to_your_array(number);
    }
    

    旁注:你可能会想到这样写:

    while (!feof(myFile))
    {
        int number;
        fscanf(myFile, "%d", &number);
        add_to_your_array(number);
    }
    

    这虽然看起来不错,但有问题。如果您确实到达文件末尾,您将在测试文件末尾之前读取一个垃圾编号并添加到您的数据中。这就是为什么你应该使用我首先提到的while 循环。

    【讨论】:

    • 谢谢@Shahbaz:是的,我打算写第二个代码,因为我需要这样做直到文件结束,即所有文件都包含用空格分隔的数字。我应该如何避免你提到的问题?
    • @Numerator,使用我的第一个示例。
    • 如果是二进制文件,每8位代表一个数字,在这种情况下我可以用fscanf吗?
    • @Numerator,不是传统的方式。对于二进制文件,fread 是您的朋友。
    • @chux,你是对的。之后我对这些东西进行了改进(试图在这里写出更好的答案),但我不记得这个答案回来修复它。
    猜你喜欢
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    相关资源
    最近更新 更多