是否可以从 C 语言函数写入 word 文件? [英] Is that possible to write to a word file from a C language function?

查看:63
本文介绍了是否可以从 C 语言函数写入 word 文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个用 C 语言编写的图书馆管理系统,它在 .dat 中有 I/O 文件.如何从这个函数中获得 word 文件的输出:

I have a Library management system written in C language which has I/O file in .dat. How is it possible to get output of word file from this function:

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 的文件格式,它是公认的.恕我直言,可能任何现代富文本文本处理工具都支持它.(我个人对 WinWord 知道这一点——多年来.)

HTML is one possibility to describe rich-text. Being the file format of WWW, it is well-established. IMHO, probably any modern Rich-Text text processing tool does support it. (I personally know this for WinWord – for years.)

编写 HTML 文件相当容易,因为 HTML 文件实际上就是可以用纯 ASCII 编写的源代码.

To write an HTML file is rather easy as the HTML file is actually nothing else than source code which may be written in plain 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;
}

示例会话:

$ 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 中打开的应用程序的一些快照:

Below, some snapshots of the applications I opened test.html in:

火狐:

Windows 版 MS Word:

MS Word for Windows:

微软 Excel:

更新:

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

In the above sample code, I carefully prevented to use meta-characters (<, >, &, and ") in the text pieces. If these characters appear in the original texts they may not be printed as is (as these characters may have special meaning in the HTML syntax). Instead, they have to be replaced by their entities:

  • <&lt;(标签开始)
  • >&gt;(标签结束)
  • &&amp;(实体开始)
  • "&quot;(引用属性值的开始/结束)
  • '&apos;(引用属性值的替代开始/结束).
  • <&lt; (begin of tag)
  • >&gt; (end of tag)
  • &&amp; (begin of entity)
  • "&quot; (begin/end of quoted attribute values)
  • '&apos; (alternative begin/end of quoted attribute values).

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

In HTML, there are a lot more pre-defined entities. (In XML, these are the only pre-defined entities.)

更新后的示例代码:

#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() 替换了这些字符中的任何一个.

" has actually to be replaced in double-quoted attribute values only. (as well as ' in single-quoted attribute values). In turn, < and > need not to be replaced in attribute values. To keep things simple and compact, the function printHTMLText() replaces any of these characters.

这篇关于是否可以从 C 语言函数写入 word 文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆