在 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 *
- 等等
我仍在尝试找出如何让程序为每个图像编写一个 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 *