c - 是否可以从 C 语言函数写入 word 文件?

标签 c ms-word

我有一个用 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在:

火狐:

Snapshot of <code>test.html</code> in Firefox

适用于 Windows 的 MS Word:

Snapshot of <code>test.html</code> in MS Word for Windows

MS Excel:

Snapshot of <code>test.html</code> in MS Excel

更新:

在上面的示例代码中,我小心翼翼地避免在文本片段中使用元字符( <>&" )。如果这些字符出现在原始文本中,它们可能不会按原样打印(因为这些字符在 HTML 语法中可能具有特殊含义)。相反,它们必须由它们的实体替换:

  • <&lt; (标签开始)
  • >&gt; (标签结束)
  • &&amp; (实体开始)
  • "&quot; (引用属性值的开始/结束)
  • '&apos; (引用属性值的替代开始/结束)。

在 HTML 中,有更多的预定义实体。 (在 XML 中,这些是唯一的预定义实体。)

更新后的示例代码:

#include <stdio.h>

void printHTMLText(FILE *f, const char *text)
{
  for (; *text; ++text) {
    switch (*text) {
      case '<': fprintf(f, "&lt;"); break;
      case '>': fprintf(f, "&gt;"); break;
      case '&': fprintf(f, "&amp;"); break;
      case '"': fprintf(f, "&quot;"); break;
      case '\'': fprintf(f, "&apos;"); 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 &amp; Ritchie</td><!-- Author -->
<td>The C Programming Language</td><!-- Title -->

注意:

"实际上只能在双引号属性值中替换。 (以及单引号属性值中的 ')。反过来,<>不需要在属性值中替换。为了保持简单和紧凑,函数 printHTMLText()替换这些字符中的任何一个。

关于c - 是否可以从 C 语言函数写入 word 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44613163/

相关文章:

.net - .NET Word 2003 加载项可以安装在 GAC 之外吗?

java - 跨编程语言的动态内存分配

c - 复制时末尾有多余字符吗?

c - 提高多线程程序的速度

java - 如何将 MS Word HTML 文档转换为干净的 XHTML 内联样式?

java - 一些 HWPF POI 文档构建示例

vba - 插入标题词 vba 2010

c - 在C中获取进程内存信息

c - 双重免费或腐败崩溃

ms-word - 如何通过保留格式使用 MS Word Web 加载项替换文本?