- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在编写一个 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() 丢弃内容或只是跳过该行。
你有几个选择:
如果您只需要数据文件中的行,您可以先通过删除所有不可打印的字符(这是那些奇怪的 ascii 字符的“官方”名称)来清理它们。在 UNIX 上,strings
等工具可以帮助您完成该过程。
当然,您也可以在代码中以编程方式执行此操作,只需读入 X 量的数据,将其存储在字符串中,然后删除那些超出标准 ASCII 字符范围的字符。这很可能会导致您丢失可能存储在文件中的任何 unicode。
如果可以,我建议您尝试第 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/
main = do input [f a] -> f [a] sequenceA [] = pure [] sequenceA (x:xs) = (:) x sequenceA xs 很
while(getline()) 和 while(!getline().eof()) 有什么区别? 正在解析输入字符串。我尝试了两种条件检查,结果有所不同。 std::string testStr =
我知道我知道。以前有人问过这个问题,但我查看了所有答案,但似乎没有一个能解决我的问题。当我使用 getline 函数获取文件中一行的内容时,它不起作用。 getline(file, line); '文
使用 getline() 函数时出现以下错误: 没有重载函数“getline”的实例匹配参数列表 在一个名为“Time”的类中,我在读取以下输入时使用它: istream & operator >>
我正在阅读 C++ 入门书并尝试所有代码示例。我对这个很感兴趣: #include #include using std::string; using std::cin; using std::c
#include #include #include using namespace std; int main() { char d,a[9],e[9]; cin.getline(a,9); c
假设我想从控制台读取一个整数,并且我不希望程序在输入非整数字符时中断。这就是我的做法: #include #include #include using namespace std; int m
这可能不是一个错误,但我不知道出了什么问题。我的第一个条目在第二次迭代中对 str1 重复,并且从那时起也是如此。只有第一次迭代顺利。 #include #include using namesp
string text; getline(text.c_str(),256); 1) 我收到错误消息“错误:没有匹配函数来调用‘getline(const char*, int)”上面有什么问题,因为
哪个更好,更受欢迎?我真的发现阅读 API 令人困惑。 最佳答案 成员(member)版读入char*,免费版读入std::string。所以更喜欢免费版!像这样使用它: std::istream &
我正在尝试解决这个问题,但出于某种原因,我一直收到这个问题: no instance of "getline" matches the argument list. 我查过这个问题,很多次是因为人们使
长话短说 使用 libc++ 版本的 getline 函数的程序在从管道读取输入时会阻塞,直到管道的缓冲区已满。 NOT libstdc++ 版本的 getline 函数也是如此:这里函数立即读取并返
我的程序的一部分: #include #include #include #include #include using namespace std; /* Works for istrin
我是一名正在准备期末考试的 C++ 初学者。我用两种方式写了一个程序。第一个代码使用 cin.getline() 并且不能正常工作。第二个代码使用 cin.get() 和 cin >> 并正确执行所有
我正在尝试使用 getline 解析文档以获取整行并将其放入名为“line”的字符串变量中。问题是我收到一条错误消息:“没有重载函数 getline 的实例与参数列表匹配。”谁能帮我解决这个问题? #
我有一个带有 getline 函数的源代码文件,当我编译它时收到错误(下面的代码和错误)。我的问题是我从一个已经编译和工作的程序(也包括在下面)中复制并粘贴了整个函数。我在程序的其他 2 个源代码文件
我正在尝试从文件中读取,但 C++ 不想运行 getline()。 我收到这个错误: C:\main.cpp:18: error: no matching function for call to '
例子: std::ifstream in("some_file.txt"); std::string line; // must be outside ? while(getline(in,line)
注意:已解决,问题不是 getline() 而是 find 函数数组填充不当! 在发布我自己的问题之前,我已经查找了几个问题,但找不到我的问题的答案。这是我发布的第一个问题,但在发布我自己的问题之前,
我的代码块中有一个 getline 函数。但是在编译 make 文件时出现以下错误: cc -DMAIN -c -o terp.o terp.c terp.c:130:15: error: con
我是一名优秀的程序员,十分优秀!