C++ 从文本转换后,二进制文件应该是什么样子? 问题:
将示例代码中的二进制I/O拆分为两个:一个程序将普通文本文件转换为二进制,另一个程序读取二进制并转换为文本。通过将文本文件与将其转换为二进制文件并返回得到的文本文件进行比较来测试这些程序 示例代码:C++ 从文本转换后,二进制文件应该是什么样子? 问题:,c++,C++,将示例代码中的二进制I/O拆分为两个:一个程序将普通文本文件转换为二进制,另一个程序读取二进制并转换为文本。通过将文本文件与将其转换为二进制文件并返回得到的文本文件进行比较来测试这些程序 示例代码: #include "std_lib_facilities.h" int main(){ cout <<"Please enter input file name.\n"; string name; cin >> name; // open
#include "std_lib_facilities.h"
int main(){
cout <<"Please enter input file name.\n";
string name;
cin >> name;
// open file to read, with no byte interpretation
ifstream ifs(name.c_str(), ios_base::binary);
if(!ifs) error("Can't open input file: ", name);
cout << "Please enter output file name.\n";
cin >> name;
// open file to write
ofstream ofs(name.c_str(), ios_base::binary);
if(!ofs) error("Can't open output file: ", name);
vector<int> v;
// read from binary file
int i;
while(ifs.read(as_bytes(i), sizeof(int))) v.push_back(i);
// do something with v
// write to binary file
for(int i = 0; i < v.size(); ++i) ofs.write(as_bytes(v[i]), sizeof(int));
return 0;
}
注:
我的文本文件包含Lorem Ipsum,没有数字或特殊标点符号。使用二进制模式编写文本后,有一个完美的字符解释,源文本文件看起来与目标完全一样。(我注意的是,当使用二进制模式和函数
write(as_bytes(),sizeof())
时,文本文件的内容翻译得非常完美,没有错误。)
问题:
在我使用二进制模式(无字符解释)和函数
write(as_bytes(),sizeof())
写入时,二进制文件应该是什么样子 在Unix land和Windows中,文件主要只是一个字节序列
使用Windows NTFS文件系统(默认情况下),同一文件中可以有多个字节序列,但总有一个主序列,即普通工具可以看到的序列。对于普通工具来说,每个文件都只是一个字节序列
在C++中,强>文本模式<强> >和>强>二进制模式关心基本的I/O机制是否应该转换为外部约定。在Unix领域没有区别。在Windows文本模式下,将换行符从内部单字节C约定(即ASCII换行符,'\n'
)转换为外部双字节Windows约定(即ASCII回车符'\r'
+换行符'\n'
),反之亦然。此外,在Windows中输入时,遇到一个单字节值26,即“控件Z”,可以解释为或可以解释为文件结尾
关于字面上的问题, “问题是它们以什么格式写入二进制文件,不应该以未解释的形式(即原始字节)写入吗 在这两种情况下,文本都以原始字节的形式写入。区别仅在于新行如何转换为新行的外部约定。因为文本1)不包含任何换行符,所以没有区别Edit:不显示在您的代码中,除非将其侧向滚动,否则会出现
fb echo这是主流>x.txt
C:\my\forums\so\0306>目录|查找“x”
04-Jul-15 08:36 PM 26 x.txt
C:\my\forums\so\0306>echo这是第二个字节流,he>x.txt:2nd
C:\my\forums\so\0306>目录|查找“x”
04-Jul-15 08:37 PM 26 x.txt
C:\my\forums\so\0306>键入x.txt
这是主流
C:\my\forums\so\0306>键入x.txt:2nd
文件名、目录名或卷标语法不正确。
C:\my\forums\so\0306>查找/v“”_
我忍不住举了个例子。:)
1) 您声明“我的文本文件包含Lorem Ipsum,没有数字或特殊标点符号”,这表示没有换行符。
不,这正是它应该表现出来的。阅读关于二进制文件的维基:@glampert我已经读过了,为什么原始文本是用人类可读的单词而不是字节来解释的?“如果在文本编辑器中打开一个二进制文件,每组8位通常会被翻译为单个字符,用户将看到(可能无法理解)文本字符的显示。”-字符由字节组成,因此就文本编辑器而言,二进制和文本之间没有区别。它将每个字节显示为可读字符。如果你想看到文件竞赛的“二进制”呈现,那么你需要在类似十六进制编辑器的东西上打开它。我不确定你想在这里做什么,但是你的textToBinary函数基本上只是复制文件而不更改它。所有的文件都是二进制文件,所以如果没有更多的上下文,将文件转换为二进制文件是没有意义的。文件表示为字节流(如何解释这些字节完全取决于您)。写入文本文件时,字符'\n'
将转换为特定于平台的“行尾序列”(所有其他字节仅写入)。在二进制文件中没有转换。读取文本文件的效果正好相反。特定于平台的行尾序列转换为字符'\n'
#include "std_lib_facilities.h"
void textToBinary(string, string);
//--------------------------------------------------------------------------------
int main(){
const string info("This program converts text to binary files.\n");
cout << info;
const string testFile("test.txt");
const string binaryFile("binary.bin");
textToBinary(testFile, binaryFile);
getchar();
return 0;
}
//--------------------------------------------------------------------------------
void textToBinary(string ftest, string fbinary){
// open text file to read
ifstream ift(ftest);
if(!ift) error("Can't open input file: ", ftest);
// copy contents in vector
vector<string>textFile;
string line;
while (getline(ift,line)) textFile.push_back(line);
// open binary file to write
ofstream fb(fbinary, ios::binary);
if(!fb) error("Can't open output file: ", fbinary);
// convert text to binary, by writing the vector contents
for(size_t i = 0; i < textFile.size(); ++i){ fb.write(textFile[i].c_str(), textFile[i].length()); fb <<'\n';}
cout << "Conversion done!\n";
}
C:\my\forums\so\0306>echo This is the main stream >x.txt
C:\my\forums\so\0306>dir | find "x"
04-Jul-15 08:36 PM 26 x.txt
C:\my\forums\so\0306>echo This is a second byte stream, he he >x.txt:2nd
C:\my\forums\so\0306>dir | find "x"
04-Jul-15 08:37 PM 26 x.txt
C:\my\forums\so\0306>type x.txt
This is the main stream
C:\my\forums\so\0306>type x.txt:2nd
The filename, directory name, or volume label syntax is incorrect.
C:\my\forums\so\0306>find /v "" <x.txt:2nd
This is a second byte stream, he he
C:\my\forums\so\0306>_