在 c 中为每个图像复制并写入一个 html 文件 - fwrite

copy and write one html file per image in c - fwrite

我仍在尝试找出如何让程序为每个图像编写一个 html 文件,我的第一个想法是在下面的评论中对 n 进行迭代,但我得到了编译器错误,因为fwrite 只接受 2 个参数,还有其他可能性吗?提前致谢。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main() {
    int i;
    char html[] = {"<html><head><style>img{height:40px;width:40px;}</style></head><body><div align='center'>"};
    char htmlend[] = {"</div></body></html>"};
    char image[] = {"<img src='\C:\Users\Sparkm4n\Desktop\material\[=11=]"};
    char imageend[] = {"'><br>[=11=]"};
    size_t bytes;
    FILE *read;
    FILE *write;
    read = fopen("C:\Users\Sparkm4n\Desktop\material\dateien.txt", "r");
    if (read == NULL) {
        printf("read error!\n");
    } else {
        printf("file opened\n");
    }
    char line[200] = {};
    int n = 0;
    write = fopen("C:\Users\Sparkm4n\Desktop\material\pics.html", "w");
    printf("pics.html opened %p\n", write);
    fwrite(html, 1, strlen(html), write);
    while (fgets(line, 200, read)) {
        printf("%s\n", line);
        ++n;
        //write=fopen("C:\Users\Sparkm4n\Desktop\material\pics",[n],".html", "w"); this one doesnt work
        fwrite(image, 1, strlen(image), write);
        fwrite(line, 1, strlen(line), write);
        fwrite(imageend, 1, 1 + strlen(imageend), write);
    }
    fwrite(htmlend, 1, strlen(htmlend), write);
    printf("%d found\n", n);
    fclose(read);
    fclose(write);
}

你的代码有几个问题,但整体逻辑是好的。

我看到您评论了旨在创建与 line 指向的当前图像关联的 HTML 文件的行。事实上,你需要 snprintf 来做你想做的格式化。此函数的作用类似于 printf,但写入缓冲区而不是写入标准输出。

所以,我重命名了一些变量,但对于其他更改,我添加了相应的注释。不过,我只减少了对命令式更改的更改,以使您的代码尽可能保持不变。阅读这些评论以了解您的代码为何不起作用。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main() {
    // <UPDATE label="standard string initialization syntax">
    char html_start[] = "<html_start><head><style>img{height:40px;width:40px;}</style></head><body><div align='center'>";
    char html_end[] = "</div></body></html_start>";
    char image_start[] = "<img src='C:\Users\Sparkm4n\Desktop\material\";
    char image_end[] = "'><br>";
    // </UPDATE>

    FILE *f_dateien;
    FILE *f_pics_html;
    f_dateien = fopen("dateien.txt", "r");
    if (f_dateien == NULL) {
        printf("f_dateien error!\n");
    }
    else {
        printf("file opened\n");
    }
    char line[200] = "";
    int n = 0;
    f_pics_html=fopen("C:\Users\Sparkm4n\Desktop\material\pics.html", "w");
    printf("pics.html opened at %p\n", f_pics_html);
    fwrite(html_start, 1, strlen(html_start), f_pics_html);
    while (fgets(line, 200, f_dateien)) {
        // <UPDATE>
        // fgets also reads the \n of a line
        // Assuming that each line never exceeds 200 characters,
        // We can do this to remove that useless \n if it is present:
        int len = strlen(line);
        if (len > 0 && line[len - 1] == '\n') {
            line[strlen(line) - 1] = '[=10=]';
            len--;
        }
        // Ignore empty lines
        if (len == 0) {
            continue;
        }
        // </UPDATE>

        printf("%s\n", line);

        ++n;

        // <UPDATE>
        // _snprintf provides a correct way to format a string
        // It's the Microsoft's attempt to mimic the standard snprintf function
        char f_one_pic_html_name[260];
        _snprintf(f_one_pic_html_name, 260, "C:\Users\Sparkm4n\Desktop\material\pics\%d.html", n);

        FILE *f_one_pic_html=fopen(f_one_pic_html_name, "w");
        // </UPDATE>

        // <UPDATE label="start the html like we've done with pics.html">
        fwrite(html_start, 1, strlen(html_start), f_one_pic_html);
        // </UPDATE>

        fwrite(image_start, 1, strlen(image_start), f_one_pic_html);
        fwrite(line,1, strlen(line), f_one_pic_html);
        // <UPDATE label="write strlen(image_end) chars, not strlen + 1">
        fwrite(image_end, 1, strlen(image_end), f_one_pic_html);
        // </UPDATE>

        // <UPDATE label="write the image in pics.html too">
        fwrite(image_start, 1, strlen(image_start), f_pics_html);
        fwrite(line,1, strlen(line), f_pics_html);
        fwrite(image_end, 1, strlen(image_end), f_pics_html);
        // </UPDATE>

        // <UPDATE label="end html">
        fwrite(html_end, 1, strlen(html_end), f_one_pic_html);
        fclose(f_one_pic_html);
        // </UPDATE>
    }

    fwrite(html_end, 1, strlen(html_end), f_pics_html);
    fclose(f_pics_html);

    printf("%d found\n", n);
    fclose(f_dateien);

    return 0;
}

大功告成,您现在可以像这样增强您的代码:

  • 使用好的变量名
  • 良好的代码格式
  • 将 strlen 的 return 存储在变量中而不是多次调用它
  • 更好的文件解析
  • 在使用 %p
  • 时将指针指向 void *
  • 等等