gpt4 book ai didi

c++ - getline() 带有 UNIX 格式化字符的文本

转载 作者:太空狗 更新时间:2023-10-29 23:18:53 26 4
gpt4 key购买 nike

我正在编写一个 C++ 程序,它从 .txt 文件中读取文本行。不幸的是,文本文件是由一个二十多岁的 UNIX 程序生成的,它包含许多奇怪的格式字符。

文件的前几行是普通的英文文本,阅读起来没有问题。但是,只要一行包含一个或多个与文本混合的这些奇怪字符,整行就会被读取为 字符并且数据会丢失。

真正令人困惑的部分是,如果我手动删除前几行,以便文件中的第一个字符是这些不寻常字符之一,那么文件中的所有内容都会被完美读取。不寻常的字符显然只显示为小的 ascii 波浪线 - 箭头、笑脸等,这很好。似乎在我不知情或未同意的情况下,根据阅读的第一行自动做出决定。

根据一些谷歌搜索,我怀疑问题可能与语言环境有关,但根据 visual studio 调试器,ifstream 对象的语言环境属性在两种情况下都是“C”。

读取数据的代码如下:

//Function to open file at location specified by inFilePath, load and process data
int OpenFile(const char* inFilePath)
{
string line;
ifstream codeFile;

//open text file
codeFile.open(inFilePath,ios::in);

//read file line by line
while ( codeFile.good() )
{
getline(codeFile,line);

//check non-zero length
if (line != "")
ProcessLine(&line[0]);
}

//close line
codeFile.close();

return 1;
}

如果有人对可能发生的事情或如何解决它有任何建议,我们将非常欢迎。

最佳答案

从阅读您的问题来看,听起来您正在阅读二进制数据,这将导致 getline() 丢弃内容或只是跳过该行。

你有几个选择:

  1. 如果您只需要数据文件中的行,您可以先通过删除所有不可打印的字符(这是那些奇怪的 ascii 字符的“官方”名称)来清理它们。在 UNIX 上,strings 等工具可以帮助您完成该过程。

    当然,您也可以在代码中以编程方式执行此操作,只需读入 X 量的数据,将其存储在字符串中,然后删除那些超出标准 ASCII 字符范围的字符。这很可能会导致您丢失可能存储在文件中的任何 unicode。

  2. 您更改程序以理解格式并基本上编写一个解析器,使您能够以更理智的方式解析文档。

如果可以,我建议您尝试第 1 种解决方案,看看结果是否正常并且是否仍然可以使用。你提到这是医疗数据,你有没有机会知道这是什么文件格式?如果你想找出并访问 unix/linux 机器,你可以使用实用程序 file,也许它可以给你一个线索(最坏的情况它会告诉你它只是数据)。

如果可能,请尝试获取一个“干净”的文件,您可以发布其十六进制转储,以便我们可以尝试提供比目前提供的更好的帮助。干净意味着文件中没有个人身份信息。


对于数字 2,以二进制模式打开文件。您提到在 std::fstream 对象中使用 Windows、二进制和非二进制文件的处理方式不同,而在 UNIX 系统上情况并非如此(在大多数系统上,我相信我会收到关于一个系统的评论与此描述不符)。

codeFile.open(inFilePath,ios::in);

会变成

codeFile.open(inFilePath, ios::in | ios::binary);

而不是 getline() 你会想要非常熟悉 .read()这将允许对 ifstream 进行无格式操作。

阅读会是这样的:

// This code has not been tested!
char input[1024];
codeFile.read(input, 1024);

int actual_read = codeFile.gcount();

// Here you can process input, up to a maximum of actual_read characters.

//ProcessLine() // We didn't necessarily read a line!
ProcessData(input, actual_read);

提到的另一件事是您可以更改当前流的 locale 并更改它认为是新行的分隔符,也许这将解决您的问题而无需使用未格式化的运算符:

imbue the stream with a new locale that only knows about the newline .此方法可能会或可能不会让您的 getline() 正常运行。

关于c++ - getline() 带有 UNIX 格式化字符的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12059205/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com