2015-04-23 73 views
0

我使用seekg和tellg找到了长度,然后将它们读取为无符号字符*。调试器显示不正确的文本。如何从文本文件中读取非ASCII字符

ifstream is (infile, ifstream::binary); 
//find length 
is.seekg (0, is.end); 
int length = is.tellg(); 
is.seekg (0, is.beg); 

char * buffer = new char [length]; 
is.read (buffer,length); 
//delete[] buffer; removed 

//size_t cipherTextLength = length;        removed  

//unsigned char* cipherText = new unsigned char[cipherTextLength]; removed 

//is.read (reinterpret_cast<char*>(cipherText),length);   removed 

编辑:

文本文件是这样的:

.l F4"w2ÍögPl Ð l œ›” ÿÿÿPl (goes on) 

调试器显示是这样的:

ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍýýýý««««««««þîþîþîþ 

编辑:现在文本文件只显示. l和调试器显示.\xl

+5

你打电话给'is.read()'来获取整个文件,把它扔掉,然后想知道为什么下一次读取尝试什么都不做。 ..?它已经在文件的末尾,并且'.eof()'为true。无论如何,这可能是一个更好的主意[将整个文件内容读入std :: string](http://stackoverflow.com/questions/2602013/read-whole-ascii-file-into-c-stdstring?rq= 1) - 它们在析构函数中释放内存,处理二进制内容就好了,并且有许多有用的函数来帮助您查询和操作它们。 –

+0

@TonyD泰勒麦克亨利的解决方案都只读取文件,直到无。 –

+1

@ atsay714你可以修正你的例子,所以你不是从'ifstream'两次阅读吗?这应该工作。话虽如此,你应该使用TonyD链接的解决方案之一,所以你不需要手动管理内存。 'istreambuf_iterator'应该读取直到到达EOF,直到第一个NUL字符。你是否以二进制模式打开文件? – Praetorian

回答

0

我认为你并没有将\0添加到缓冲区。我确实面临同样的问题,并通过adding+1来解决它的长度。

char *buffer = new char [length + 1]; 
buffer[length] = 0; // Adding terminating character in content. 
iFileStream.read(buffer, length); 
std::string str(buffer); 

现在str应该是正确的。希望这可以帮助。

0

由于你的代码if.read可以得到二进制文件。你的程序是字符串输出除外。你可以在缓冲区中使用%c来打印字符

相关问题