我有一个用 C 语言编写的图书馆管理系统,它在 .dat
中有 I/O 文件。如何从这个函数中获取 word 文件的输出:
void viewbooks(void) //show the list of book persists in library
{
int i=0,j;
system("cls");
gotoxy(1,1);
printf("*********************************Book List*****************************");
gotoxy(2,2);
printf(" CATEGORY ID BOOK NAME AUTHOR QTY PRICE RackNo ");
j=4;
fp=fopen("Bibek.dat","rb"); //the .dat file getting data to be showed
while(fread(&a,sizeof(a),1,fp)==1) // .dat file to be read
{
gotoxy(3,j);
printf("%s",a.cat);
gotoxy(16,j);
printf("%d",a.id);
gotoxy(22,j);
printf("%s",a.name);
gotoxy(36,j);
printf("%s",a.Author);
gotoxy(50,j);
printf("%d",a.quantity);
gotoxy(57,j);
printf("%.2f",a.Price);
gotoxy(69,j);
printf("%d",a.rackno);
printf("\n\n");
j++;
i=i+a.quantity;
}
gotoxy(3,25);
printf("Total Books =%d",i);
fclose(fp);
gotoxy(35,25);
returnfunc();
}
最佳答案
HTML 是一种描述富文本的可能性。作为 WWW 的文件格式,它是公认的。恕我直言,可能任何现代 Rich-Text 文本处理工具都支持它。 (我个人对 WinWord 了解这一点——多年了。)
编写 HTML 文件相当容易,因为 HTML 文件实际上就是可以用纯 ASCII 编写的源代码。
一个简短的演示 print-HTML.c
:
#include <stdio.h>
struct Entry {
const char *author;
const char *title;
};
void printEntry(FILE *f, struct Entry *pEntry, int i)
{
fprintf(f,
"<tr><!-- start of table row -->\n"
"<td>%d</td><!-- number -->\n"
"<td>%s</td><!-- Author -->\n"
"<td>%s</td><!-- Title -->\n"
"</tr><!-- end of table row -->\n",
i, pEntry->author, pEntry->title);
}
void printTable(FILE *f, size_t nEntries, struct Entry table[])
{
fprintf(f,
"<table><!-- start of table -->\n"
"<tr><!-- start of table head row -->\n"
"<th>No.</th><th>Author</th><th>Title</th>\n"
"</tr><!-- end of table head row -->\n");
for (size_t i = 0; i < nEntries; ++i) {
printEntry(f, table + i, (int)i + 1);
}
fprintf(f,
"</table><!-- end of table -->\n");
}
void printDoc(
FILE *f, const char *title, size_t nEntries, struct Entry table[])
{
fprintf(f,
"<!DOCTYPE html>\n"
"<html>\n"
"<head>\n"
"<title>%s</title>\n"
"</head>\n"
"<body>\n"
"<h1>%s</h1>\n",
title, title);
printTable(f, nEntries, table);
fprintf(f,
"</body>\n"
"</html>\n");
}
int main()
{
/* the sample table */
struct Entry table[] = {
{ "Kernighan and Ritchie", "The C Programming Language" },
{ "Kernighan and Ritchie", "Programming in C" },
{ "Tim Berners-Lee", "Weaving the Web" },
{ "Tim Berners-Lee", "Hypertext Markup Language: the HTML explained from the Inventor of the WWW" }
};
enum { nEntries = sizeof table / sizeof table[0] };
/* output as HTML */
printDoc(stdout, "My Favorite Books", nEntries, table);
/* done */
return 0;
}
示例 session :
$ gcc -std=c11 -o print-HTML print-HTML.c
$ ./print-HTML
<!DOCTYPE html>
<html>
<head>
<title>My Favorite Books</title>
</head>
<body>
<h1>My Favorite Books</h1>
<table><!-- start of table -->
<tr><!-- start of table head row -->
<th>No.</th><th>Author</th><th>Title</th>
</tr><!-- end of table head row -->
<tr><!-- start of table row -->
<td>1</td><!-- number -->
<td>Kernighan and Ritchie</td><!-- Author -->
<td>The C Programming Language</td><!-- Title -->
</tr><!-- end of table row -->
<tr><!-- start of table row -->
<td>2</td><!-- number -->
<td>Kernighan and Ritchie</td><!-- Author -->
<td>Programming in C</td><!-- Title -->
</tr><!-- end of table row -->
<tr><!-- start of table row -->
<td>3</td><!-- number -->
<td>Tim Berners-Lee</td><!-- Author -->
<td>Weaving the Web</td><!-- Title -->
</tr><!-- end of table row -->
<tr><!-- start of table row -->
<td>4</td><!-- number -->
<td>Tim Berners-Lee</td><!-- Author -->
<td>Hypertext Markup Language: the HTML explained from the Inventor of the WWW</td><!-- Title -->
</tr><!-- end of table row -->
</table><!-- end of table -->
</body>
</html>
$ ./print-HTML >test.html
$
下面是我打开的应用程序的一些快照 test.html
在:
火狐:
适用于 Windows 的 MS Word:
MS Excel:
更新:
在上面的示例代码中,我小心翼翼地避免在文本片段中使用元字符( <
、 >
、 &
和 "
)。如果这些字符出现在原始文本中,它们可能不会按原样打印(因为这些字符在 HTML 语法中可能具有特殊含义)。相反,它们必须由它们的实体替换:
-
<
⇒<
(标签开始) -
>
⇒>
(标签结束) -
&
⇒&
(实体开始) -
"
⇒"
(引用属性值的开始/结束) -
'
⇒'
(引用属性值的替代开始/结束)。
在 HTML 中,有更多的预定义实体。 (在 XML 中,这些是唯一的预定义实体。)
更新后的示例代码:
#include <stdio.h>
void printHTMLText(FILE *f, const char *text)
{
for (; *text; ++text) {
switch (*text) {
case '<': fprintf(f, "<"); break;
case '>': fprintf(f, ">"); break;
case '&': fprintf(f, "&"); break;
case '"': fprintf(f, """); break;
case '\'': fprintf(f, "'"); break;
default: putc(*text, f);
}
}
}
struct Entry {
const char *author;
const char *title;
};
void printEntry(FILE *f, struct Entry *pEntry, int i)
{
fprintf(f,
"<tr><!-- start of table row -->\n"
"<td>%d</td><!-- number -->\n"
"<td>",
i);
printHTMLText(f, pEntry->author);
fprintf(f,
"</td><!-- Author -->\n"
"<td>");
printHTMLText(f, pEntry->title);
fprintf(f,
"</td><!-- Title -->\n"
"</tr><!-- end of table row -->\n");
}
void printTable(FILE *f, size_t nEntries, struct Entry table[])
{
fprintf(f,
"<table><!-- start of table -->\n"
"<tr><!-- start of table head row -->\n"
"<th>No.</th><th>Author</th><th>Title</th>\n"
"</tr><!-- end of table head row -->\n");
for (size_t i = 0; i < nEntries; ++i) {
printEntry(f, table + i, (int)i + 1);
}
fprintf(f,
"</table><!-- end of table -->\n");
}
void printDoc(
FILE *f, const char *title, size_t nEntries, struct Entry table[])
{
fprintf(f,
"<!DOCTYPE html>\n"
"<html>\n"
"<head>\n"
"<title>");
printHTMLText(f, title);
fprintf(f,
"</title>\n"
"</head>\n"
"<body>\n"
"<h1>");
printHTMLText(f, title);
fprintf(f,
"</h1>\n");
printTable(f, nEntries, table);
fprintf(f,
"</body>\n"
"</html>\n");
}
int main()
{
struct Entry table[] = {
{ "Kernighan & Ritchie", "The C Programming Language" },
{ "Kernighan & Ritchie", "Programming in C" },
{ "Tim Berners-Lee", "Weaving the Web" },
{ "Tim Berners-Lee", "Hypertext Markup Language: the HTML explained from the Inventor of the WWW" }
};
enum { nEntries = sizeof table / sizeof table[0] };
printDoc(stdout, "My Favorite Books", nEntries, table);
return 0;
}
将打印例如
{ "Kernighan & Ritchie", "The C Programming Language" }
作为:
<td>Kernighan & Ritchie</td><!-- Author -->
<td>The C Programming Language</td><!-- Title -->
注意:
"
实际上只能在双引号属性值中替换。 (以及单引号属性值中的 '
)。反过来,<
和 >
不需要在属性值中替换。为了保持简单和紧凑,函数 printHTMLText()
替换这些字符中的任何一个。
关于c - 是否可以从 C 语言函数写入 word 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44613163/