读doc,docx,pdf的C程序 我想在C(C,不是C++或java)中编写一个程序,它将读取DOC、DOX、PDF,并希望在GITHUB上使用,以供所有需要该代码的人使用。所以我从.doc文件开始,我探索过,如果我用简单的记事本打开.doc文件,它将显示所有文本,但只显示一些额外的内容,您可以很容易地修剪它们。所以我确实编写了一个简单的c程序,在“r”和“rb”模式下读取.doc wile,但这两次它都只给了我文件中的5-9个字符,而且这些字符也不可读。我不知道为什么会这样。任何评论或讨论都会对我很有帮助

读doc,docx,pdf的C程序 我想在C(C,不是C++或java)中编写一个程序,它将读取DOC、DOX、PDF,并希望在GITHUB上使用,以供所有需要该代码的人使用。所以我从.doc文件开始,我探索过,如果我用简单的记事本打开.doc文件,它将显示所有文本,但只显示一些额外的内容,您可以很容易地修剪它们。所以我确实编写了一个简单的c程序,在“r”和“rb”模式下读取.doc wile,但这两次它都只给了我文件中的5-9个字符,而且这些字符也不可读。我不知道为什么会这样。任何评论或讨论都会对我很有帮助,c,pdf,docx,doc,C,Pdf,Docx,Doc,这里是github的链接。请帮助我完成所有三种格式。< /强> < p>查看 doc < /c>文件类型,作为 txt < /c>文件,但在您的内容之前、中、之后有额外的不可打印字符。这些不可打印字符用于定义特殊格式、元数据和其他信息 如上所述,所有.doc文件都遵循一定的结构 如果在十六进制编辑器中打开两个不同的.doc文件,您会注意到两个文件的文本内容都从文件开头的偏移量0xA00(2560字节)开始。这意味着,当您最初打开文件时,可以忽略文件的前2560字节(查看fseek()函数) 从

这里是github的链接。请帮助我完成所有三种格式。< /强>

< p>查看<代码> doc < /c>文件类型,作为<代码> txt < /c>文件,但在您的内容之前、中、之后有额外的不可打印字符。这些不可打印字符用于定义特殊格式、元数据和其他信息

如上所述,所有
.doc
文件都遵循一定的结构

如果在十六进制编辑器中打开两个不同的
.doc
文件,您会注意到两个文件的文本内容都从文件开头的偏移量
0xA00
(2560字节)开始。这意味着,当您最初打开文件时,可以忽略文件的前2560字节(查看
fseek()
函数)

从这一点开始,您可以读取文件的内容,直到到达
'\0'

我还没有看到
.pdf
.docx
文件的实现,但是您可以使用十六进制编辑器打开这两个文件,并找出可以使用什么模式来隔离文件的重要内容

希望这有帮助

编辑:您始终可以找到有关要操作的不同文件格式的文档。以下是PDF文件类型的规范:


别指望这个主意会有什么结果。doc是一种庞大的二进制文件格式,解析起来异常复杂。尽管如此,Cubia提到了文档文本部分开始的偏移量。我不熟悉格式的细节,但如果原始文本包含在一个位置,请使用
fseek
获取它,并在到达末尾时停止。其他格式不会是这种情况,因为它们非常不同

.docx和.pdf应该更容易解析,因为它们是更现代的格式。如果您想从docx中读取任何内容,您需要从包含大量xml的zip文件中读取内容,并使用解析器找出您想要的文本

.pdf应该是三个库中最简单的一个,因为你可能会找到一个几乎可以做你想做的事情的库

至于为什么从程序中得到奇怪的输出,请记住.doc是一种二进制格式,从您的角度来看,绝大多数数据都是垃圾。将其转储到终端将产生可读的文本,但也会产生一堆控制字符,这些字符会与终端发生冲突


最后,请注意-不要尝试使用
fread
直接读取docx文件-它们是压缩的,因此您可能无法恢复未更改的文本。看看libarchive。另外-希望必须阅读文档规范。docx似乎是微软对openoffice格式的扩展。请参阅和一些PDF规范文档(有多个版本)。

要回答您的具体问题,您的小应用程序停止阅读的原因是它错误地认为文件中有一个
EOF
字符

看看你的代码:

char ch;
int nol=0, not=0, nob=0, noc=0;
FILE *fp;
fp = fopen("file.doc","rb");
while(1)
{
    ch = fgetc(fp);
    if(ch==EOF)
    {
        break;
    }
fgetc(fp)
的结果存储在char类型的变量中,该变量是一个单字节变量。然而,fgetc的结果是非常有目的的“
int
”,而不是“
char

fgetc
始终返回0到255范围内的正结果,除非到达文件末尾,在这种情况下,它返回
EOF
,该值通常实现为-1


如果读取值为255的字节并将其存储在int中,则一切正常,它存储为值255,循环可以继续。如果将结果存储在一个char中,它将被解释为等于EOF。循环停止。

所有这些格式都使用不同的编码,您必须查找它们。这并不像用
fopen
读取文件并不幸地将其打印出来那么简单。我已经知道了这一点,并且也研究了它们,因为我告诉他们我的第一个问题是reading.doc。我在这里的问题是,为什么我在打开.doc时可以从它的记事本或任何其他文本编辑器中读取文本,而不是在C程序中?将您的问题更改到这种程度是非常糟糕的。这样,你基本上是a)不给任何发现你代码中的问题的人评分,b)你使所有的答案对以后的读者来说完全无用和不可理解(因为您已经通过编辑转到了一个新问题。请在新问题中提出新问题,而不是更改现有问题!我不会更改问题。问题是如何在CY中读取doc fox和PDF您最初的问题是为什么您的代码片段没有正确读取文件,而是停止了。我回答了。之后,您可以让代码变得完全不同。如果你现在说你的问题是如何阅读这三种格式的总和,我会将其标记为过于宽泛,事实就是如此。就像你描述的方式一样,一旦我检查你可以用十六进制编辑器打开这两个文件并弄明白-为什么不改为阅读s指定?我尝试先查找您所说的偏移量0xA00,然后再次尝试读取,但结果是相同的,可能应该将其作为流读取,我不知道。@mkl我已经考虑过了。我做了一些研究,但找不到正确的关键字以获得完整的文档o