如何打开递增的单个文件?

How do I open individual files that increment up?

提问人:LifeLong21 提问时间:7/31/2023 最后编辑:LifeLong21 更新时间:7/31/2023 访问量:64

问:

所以我正在做这个功课,我必须通过存储卡,通过将数据放入缓冲区,从缓冲区数据创建新的JPEG文件,然后将该数据写入这些新文件来获取图像,从而恢复一些图像。现在,我被困在如何使用 C 中的 fopen 函数打开新创建的文件以写入该数据,并且每个文件都命名为“###.jpg”,从 000.jpg 增加到 050.jpg。我想我可以一遍又一遍地打开并编写文件,但这显然是本能错误的。

下面是一个粗略的代码片段来解释我的问题。在写这篇文章时,我并不真正担心内存分配或分段错误/错误,我只是想传达我的想法,以便你们都理解我的问题。我尝试将 file_num 放在“w”之后的 fopen 的末尾参数中,但这只是一个错误。

#include <stdio.h>
#include <stdlib.h>

const BLOCK_SIZE = 512;
int buffer[BLOCK_SIZE];
unsigned int file_num = 0;

int main()
{
    //Open memory card
    FILE *pFile = fopen(card.raw, "r");

    //Open and create JPEG files
    while(fread(buffer, 1, BLOCK_SIZE, pFile) == BLOCK_SIZE)
    {
        if(some condition)
        {
            //Create JPEG file
            sprintf(pFile, "%.03i.jpg", file_num++);

            //Open new JPEG files to write data(this is my problem right here)
            FILE *pImg = fopen(###.jpg, "w");

            ....
        }
    }
}
C 文件 PrintF CS50 FOPEN

评论

1赞 Ingo Leonhardt 7/31/2023
创建文件名是可以的,只缺少“%”,你不应该使用前导“.”。只需在sprintf()fopen(pFile, "w");
0赞 Ingo Leonhardt 7/31/2023
对不起,我忽略了,这是一个.你需要一个 char 数组来存储名称,比如pFileFILE *char name[20]; sprintf(name,"%03i.jpg", file_num++); FILE *pImg = fopen(name,"w");
0赞 LifeLong21 7/31/2023
哎 呦!错别字忘记了%,我的坏 XD。但我的问题是,虽然我知道如何打开新创建的文件,但我不知道如何在循环中连续打开它们。我不想创建文件,然后单独输入新制作的###.jpg文件,因为一旦写入数据,应该有50个图像。那是我的问题。
0赞 Ingo Leonhardt 7/31/2023
我不太明白你在哪里看到问题。每当您决定必须创建另一个文件时,您都会关闭旧文件,创建一个新文件名(多亏了您的诀窍)并打开该文件。就这样file_num++sprintf()
0赞 LifeLong21 7/31/2023
嗯 FUUUU- 好吧,imma 尝试一些有点愚蠢的东西,并在第二次使用它时更改 fopen(循环内的那个)。我知道这看起来会不对,但相信这个过程!“FILE *pImg = fopen(”%03i.jpg“, ”w“, file_num++);”。我认为这会有所帮助吗?或者让它变得更糟,idk。

答:

2赞 Oka 7/31/2023 #1

您需要一个字符缓冲区来存储创建的字符串。此字符串用作 的第一个参数。sprintffopen

的格式说明符是 ,而不是 。printfunsigned int%u%i

下面是一个简单的示例,用于创建文件 000.jpg 到 050.jpg(包括 050)。

它还将每个文件的名称写入相应的文件(包含在 中)。< >

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char file_name[64];

    for (unsigned n = 0; n <= 50; n++) {
        sprintf(file_name, "%03u.jpg", n);

        FILE *current_file = fopen(file_name, "w");

        if (current_file) {
            fprintf(current_file, "<%s>\n", file_name);
            fclose(current_file);
        }
    }
}

使用中:

$ ./create_files
$ ls
000.jpg  007.jpg  014.jpg  021.jpg  028.jpg  035.jpg  042.jpg  049.jpg
001.jpg  008.jpg  015.jpg  022.jpg  029.jpg  036.jpg  043.jpg  050.jpg
002.jpg  009.jpg  016.jpg  023.jpg  030.jpg  037.jpg  044.jpg  create_files
003.jpg  010.jpg  017.jpg  024.jpg  031.jpg  038.jpg  045.jpg  create_files.c
004.jpg  011.jpg  018.jpg  025.jpg  032.jpg  039.jpg  046.jpg
005.jpg  012.jpg  019.jpg  026.jpg  033.jpg  040.jpg  047.jpg
006.jpg  013.jpg  020.jpg  027.jpg  034.jpg  041.jpg  048.jpg
$ cat 000.jpg 040.jpg
<000.jpg>
<040.jpg>
$ rm {000..050}.jpg