我一直在尝试strcmp
在某些条件下提高性能.但是,遗憾的是,我甚至无法实现普通的vanilla strcmp
以及库实现.
我看到了一个类似的问题,但答案说差异来自编译器优化掉字符串文字的比较.我的测试不使用字符串文字.
这是实现(comparisons.cpp)
int strcmp_custom(const char* a, const char* b) {
while (*b == *a) {
if (*a == '\0') return 0;
a++;
b++;
}
return *b - *a;
}
Run Code Online (Sandbox Code Playgroud)
这是测试驱动程序(driver.cpp):
#include "comparisons.h"
#include <array>
#include <chrono>
#include <iostream>
void init_string(char* str, int nChars) {
// 10% of strings will be equal, and 90% of strings will have one char different.
// This way, many strings will share long prefixes …
Run Code Online (Sandbox Code Playgroud) 我一直在尝试编写一个简单的控制台应用程序或PowerShell脚本来从大量PDF文档中提取文本.有几个库和CLI工具可以实现这一点,但事实证明,没有一个能够可靠地识别文档结构.特别是我关注文本列的识别.即使非常昂贵的PDFLib TET工具也经常混淆两个相邻文本列的内容.
经常注意到PDF格式没有列的任何概念,甚至没有单词的概念.关于SO的类似问题的几个答案提到了这一点.这个问题非常严重,甚至可以保证学术研究.这篇期刊文章指出:
PDF文件中的所有数据对象都以面向视觉的方式表示,作为一系列操作符...通常不传达有关更高级别文本单元(如标记,行或列)的信息 - 有关这些单元之间边界的信息只能通过空格隐式提供
因此,我尝试过的所有提取工具(iTextSharp,PDFLib TET和Python PDFMiner)都无法识别文本列边界.在这些工具中,PDFLib TET表现最佳.
然而,SumatraPDF,非常轻量级的开源PDF阅读器,以及许多其他类似的可以完美识别列和文本区域.如果我在其中一个应用程序中打开文档,选择页面上的所有文本(甚至整个文档用CTRL + A)复制并粘贴到文本文件中,文本将以正确的顺序呈现几乎完美无缺.它偶尔会将页脚和标题文本混合到其中一列中.
所以我的问题是,这些应用程序如何做看似困难的事情(即使是像PDFLib这样昂贵的工具)?
编辑2014年3月31日:值得一提的是,我发现PDFBox在文本提取方面比iTextSharp好得多(尽管有一个定制的策略实现),PDFLib TET略胜PDFBox,但它相当昂贵.Python PDFMiner是没有希望的.我见过的最好的结果来自谷歌.可以将PDF(每次2GB)上传到Google云端硬盘,然后将其作为文本下载.这就是我在做的事情.我写了一个小工具,将我的PDF分成10个页面文件(Google只会转换前10页),然后在下载后将它们拼接回来.
编辑2014年4月7日.取消我的最后一次.最好的提取是通过MS Word实现的.这可以在Acrobat Pro中自动执行(工具>操作向导>创建新操作).可以使用.NET OpenXml库自动化Word到文本.这是一个非常巧妙地进行提取(docx到txt)的类.我的初始测试发现MS Word转换在文档结构方面要准确得多,但是一旦转换为纯文本就不那么重要了.
我一直在尝试使用以下代码加载JDBC MySQL连接器:
import java.sql.*;
public class dbTest{
public static void main(String[] args) throws SQLException, ClassNotFoundException
{
Class.forName("com.mysql.jdbc.Driver");
}
}
Run Code Online (Sandbox Code Playgroud)
我一直得到一个没有找到的例外:
java.lang.ClassNotFoundException
at edu.rice.cs.plt.reflect.PathClassLoader.findClass(PathClassLoader.java:148)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at dbTest.main(dbTest.java:6)
Run Code Online (Sandbox Code Playgroud)
我已将驱动程序的路径(mysql-connector-java-3.1.14-bin.jar)添加到我的类路径中并进行了双重检查以确保它是正确的.我还根据我从本文中读到的内容,将jar的副本添加到我的Java安装的ext文件夹中:http://www.developer.com/java/data/jdbc-and-mysql-installation-and-preparation-的-mysql.html
我还搜索了遇到此问题的其他人的帖子,但到目前为止所有的回复都说过要将连接器jar添加到类路径中,我已经完成了.
任何帮助将不胜感激.
我有以下三个文件:
#ifndef INLINE_HEADER_H
#define INLINE_HEADER_H
inline int func1() {
return 1;
}
#endif
Run Code Online (Sandbox Code Playgroud)
#include "inline_header.h"
Run Code Online (Sandbox Code Playgroud)
#include "inline_header.h"
int main() {
func1();
}
Run Code Online (Sandbox Code Playgroud)
当我编译只是source2.c
用gcc source2.c
它编译.但是,当我尝试编译时,gcc source1.c source2.c
我得到一个多重定义错误,如下所示:
/tmp/cchsOaHF.o: In function `func1':
source2.c:(.text+0x0): multiple definition of `func1'
/tmp/ccEyUW0T.o:source1.c:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我正在使用Uccntu 14.04上的gcc 4.8.4进行编译.
我试过看了这个,发现了一个类似的问题,内联函数的多个定义.但是在他的情况下,错误是由他的内联函数的重新定义引起的.就我而言,我没有重新定义它(或者至少没有明确地......).