以C+;格式读取并输出可能的unicode torrent内容+;? 我尝试编写一个简单的C++程序来打开一个Trror文件(通过ARGV(1)),读取所有的文件,然后逐字打印整个文件的内容,没有改动,它必须打印原始洪流的副本。问题是,一些激流可能包含日语、俄语等(文件名、描述等)。。。当然还有标准的torrent数据和散列等等。 做这件事最好的方法是什么?到目前为止,我只输出了一部分内容,它似乎没有正确地读取或打印数据。。。它是乱码之类的: #include "stdafx.h" #include <iostream> #include <fstream> #include <string> using namespace std; #if defined(UNICODE) #define _tcout wcout #else #define _tcout cout #endif int _tmain(int argc, TCHAR* argv[]) { wifstream File(argv[1]); wstring Line; while(!File.eof() ) { getline(File, Line); _tcout << Line << endl; } File.close(); return 0; } #包括“stdafx.h” #包括 #包括 #包括 使用名称空间std; #如果已定义(UNICODE) #定义输出wcout #否则 #定义输出值 #恩迪夫 int_tmain(int argc,TCHAR*argv[]) { wifstream文件(argv[1]); 环行线; 而(!File.eof()) { getline(文件,行); _t输出

以C+;格式读取并输出可能的unicode torrent内容+;? 我尝试编写一个简单的C++程序来打开一个Trror文件(通过ARGV(1)),读取所有的文件,然后逐字打印整个文件的内容,没有改动,它必须打印原始洪流的副本。问题是,一些激流可能包含日语、俄语等(文件名、描述等)。。。当然还有标准的torrent数据和散列等等。 做这件事最好的方法是什么?到目前为止,我只输出了一部分内容,它似乎没有正确地读取或打印数据。。。它是乱码之类的: #include "stdafx.h" #include <iostream> #include <fstream> #include <string> using namespace std; #if defined(UNICODE) #define _tcout wcout #else #define _tcout cout #endif int _tmain(int argc, TCHAR* argv[]) { wifstream File(argv[1]); wstring Line; while(!File.eof() ) { getline(File, Line); _tcout << Line << endl; } File.close(); return 0; } #包括“stdafx.h” #包括 #包括 #包括 使用名称空间std; #如果已定义(UNICODE) #定义输出wcout #否则 #定义输出值 #恩迪夫 int_tmain(int argc,TCHAR*argv[]) { wifstream文件(argv[1]); 环行线; 而(!File.eof()) { getline(文件,行); _t输出,c++,unicode,fstream,bittorrent,C++,Unicode,Fstream,Bittorrent,您在读取文件时犯了一个典型的基本错误: while(!File.eof() ) { getline(File, Line); // If this line fails (ie you reach EOF) // Then you still print out the Line (whoes value is undefined) _tcout << Line << endl; } while(!Fi

您在读取文件时犯了一个典型的基本错误:

while(!File.eof() )
{
    getline(File, Line); // If this line fails (ie you reach EOF)
                         // Then you still print out the Line (whoes value is undefined)

    _tcout << Line << endl;
}
while(!File.eof())
{
getline(文件,行);//如果此行失败(即到达EOF)
//然后仍然打印出该行(其值未定义)

_t输出使用
wifstream
您将文件视为UTF-16,这是错误的。torrent明确表示它使用字节的字符串,而不是Unicode字符。我的印象是BT不关心字符集(代码页),将其留给客户端程序进行解释。文件名只是字节字符串,没有附加任何意义


torrent文件不是文本文件,因为它包含二进制散列值,所以尝试将其作为文本文件读写不是一个好主意。最好实现一个bencoding解析器,以便您可以在输出散列值之前将其转换为十六进制。

正如Neil Mayhew在回答中提到的那样,将整个.torrent文件视为文本doesn没有多大意义,因为它包含二进制数据

你应该重新考虑以下几点:

  • 不要使用宽字符流,因为文件大小可能不是
    sizeof(wchar\u t)
    的倍数
  • 在这种情况下,
    read()
    优于
    getline()
    ,因为.torrent文件不使用基于行的文本格式
  • 打开文件时请使用
    ios::binary
    标志,否则您将得到不需要的行尾转换(这在Windows上发生)
  • 出于同样的原因,您还应该将
    cout
    切换到二进制模式

仍然不起作用,而且看起来你是对的-字符不匹配(将输出与notepad和editpad pro显示的内容进行比较),但我不太确定检查终端属性是什么意思。引用BitTorrent规范“包含文本的.torrent文件中的所有字符串都必须是UTF-8编码的。”。尽管有些“字符串”不包含文本,实际上只是字节数组。此外,
wifstream
作为UTF-16是Windows的一个实现细节-语言不能保证它是这样的。(语言由实现决定…)
while(getline(File, Line))
{
    _tcout << Line << endl;
}