使用while循环打开文件-C

时间:2018-11-25 19:35:56

标签: c file fopen

您好,程序员们。 我没什么问题我无法弄清楚如何打开文件号(从文件名开始)从1到存在的任意数量的文件。

例如,我有两个(或最终为 n )文件,分别名为game_1.txtgame_2.txt。此循环应打开这两个文件(或最终在该文件夹中以该模式打开的所有文件)。

我遇到错误,即:

  

传递'fopen'的参数2使指针从整数开始而没有   演员。

这是我所拥有的:

main()
{
    FILE *fr;
    int i=1;
    char b;

    while(fr=fopen("game_%d.txt",i) != NULL)
    {
        while(fscanf(fr,"%c",&b) > 0)
        {
            printf("%c",b);
        }
        i++;
    }


    return 0;
}

2 个答案:

答案 0 :(得分:2)

使用sprintf()构建文件名:

#include <stdio.h>
                // the c standard requires, that main() returns int
int main(void)  // you should put void in the parameter list if a
{               // when a function takes no parameters.
    char filename_format[] = "game_%d.txt";
    char filename[sizeof(filename_format) + 3];  // for up to 4 digit numbers

    for (int i = 1; i < 1000; ++i) {
        snprintf(filename, sizeof(filename), filename_format, i);
        FILE *fr = fopen(filename, "r");  // open for reading

        if(!fr)      // if the file couldn't be opened
             break;  // break the loop

        int ch;
        while ((ch = fgetc(fr)) != EOF)
            putchar(ch);

        fclose(fr);  // close the file when no longer needed.
    }                // since fr will be overwritten in the next
                     // iteration, this is our last chance.
    return 0;
}

答案 1 :(得分:-1)

您可能需要这样的东西:

#include <stdio.h>

int main()
{
    FILE *fr;
    int i = 1;
    char b;

    while (1) // infinite loop, until broken out of
    {
        char to_open[32];
        snprintf(to_open, 32, "game_%d.txt", i);

        if ((fr = fopen(to_open, "r")) == NULL)
        {
            break;
        }

        while (fscanf(fr, "%c", &b) > 0)
        {
            printf("%c",b);
        }

        fclose(fr); // close the file after work is done

        i++;
    }

    return 0;
}

在原始代码中,对fopen的API调用将失败,因为它需要的第二个参数是一个字符串,其中包含打开文件时应使用的模式(在这种情况下,我选择了{{1 }}-打开文件进行输入操作)。

因为"r"不支持字符串格式设置(例如使用fopen),所以需要调用snprintf到中间临时数组。

然后,当无法再使用%d语句打开下一个文件时,主循环可以结束。

在完成必要的工作(在这种情况下,“工作”将是内部break循环)之后包括对fclose的调用也是一个好主意。没有不必要的内存和资源泄漏。