使用while循环打开文件-C

使用while循环打开文件-C,c,file,fopen,C,File,Fopen,各位程序员好。 我没什么问题。我不知道如何打开不同编号(文件名中)的文件,从1到任何数量的文件 例如,我有两个(或最终是n个)文件,分别名为game_1.txt和game_2.txt。这个循环应该打开这两个文件(或者最终全部使用这个模式,在那个文件夹中) 我得到了一些错误,即: 传递'fopen'的参数2使指针从整数变为不带 演员 以下是我所拥有的: main() { FILE *fr; int i=1; char b; while(fr=fopen("game

各位程序员好。 我没什么问题。我不知道如何打开不同编号(文件名中)的文件,从1到任何数量的文件

例如,我有两个(或最终是n个)文件,分别名为
game_1.txt
game_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;
}

您可能需要这样的东西:

#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;
}
#包括
int main()
{
文件*fr;
int i=1;
字符b;
while(1)//无限循环,直到中断
{
char to_open[32];
snprintf(开放,32,“游戏%d.txt”,i);
如果((fr=fopen(to_open,“r”))==NULL)
{
打破
}
而(fscanf(fr、%c、&b)>0)
{
printf(“%c”,b);
}
fclose(fr);//工作完成后关闭文件
i++;
}
返回0;
}
在原始代码中,对的API调用将失败,因为它需要的第二个参数是一个字符串,包含打开文件时应使用的模式(在本例中,我选择了
“r”
-打开文件进行输入操作)

需要调用中间临时数组,因为
fopen
不支持字符串格式(例如使用
%d

之后,当下一个文件无法再使用
break
语句打开时,主循环可以完成

在必要的工作完成后(在本例中,“工作”将是内部
while
循环),包含对的调用也是一个好主意,这样就不会有不必要的内存和资源泄漏。

使用
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;
}
#包括
//c标准要求main()返回int
int main(void)//如果
{//当函数不带参数时。
char filename_format[]=“game_u%d.txt”;
char filename[sizeof(filename_format)+3];//最多4位数字
对于(int i=1;i<1000;++i){
snprintf(文件名,sizeof(文件名),文件名\格式,i);
FILE*fr=fopen(文件名,“r”);//打开阅读
if(!fr)//如果无法打开文件
break;//中断循环
int-ch;
而((ch=fgetc(fr))!=EOF)
putchar(ch);
fclose(fr);//不再需要时关闭文件。
}//因为fr将在下一个
//迭代,这是我们最后的机会。
返回0;
}

你应该试着读懂fopen的人,第二个参数不是文件编号(不管它是什么意思)例如,请看对不起,无法理解你的意思,请用更简单的话向其他初学者解释。非常感谢模式的第二个参数iis,我想在您的情况下它应该是“r”,请参阅另一个示例好的,但是我如何才能打开以%d作为变量的文件,例如game_1.txt和game_2.txt等。请勿使用或推荐
sprintf
。使用
snprintf
。不要使用或推荐
sprintf
。使用
snprintf
@jamesdlin它实际上没有什么区别,因为在这种情况下,值是有限的,但一般来说,你是对的,当然,更改了。这是几年?为什么每个人都不断推荐sprintf?使用
snprintf
。它在近20年前被标准化了。