C++ 流<&书信电报;运营商没有';无法将正确的大小写入文件

C++ 流<&书信电报;运营商没有';无法将正确的大小写入文件,c++,file,io,fstream,C++,File,Io,Fstream,说到这个,我对文件IO非常不确定,我真的很困惑。当我使用insertion stream运算符将一些短整数推入文件时,文件的大小与我预期的不同: std::ofstream outFile("myFile.raw", std::ios::binary | std::ios::out); std::vector<short> list; for (int i = 0; i < 100; ++i) list.push_back(1); for (auto i : list) ou

说到这个,我对文件IO非常不确定,我真的很困惑。当我使用insertion stream运算符将一些短整数推入文件时,文件的大小与我预期的不同:

std::ofstream outFile("myFile.raw", std::ios::binary | std::ios::out);

std::vector<short> list;
for (int i = 0; i < 100; ++i) list.push_back(1);
for (auto i : list) outFile << i;
outFile.close();
std::of流输出文件(“myFile.raw”,std::ios::binary | std::ios::out);
std::向量表;
对于(int i=0;i<100;++i)列表,向后推(1);
对于您正在使用的(自动i:list)输出文件

short int
s以数字形式写入。每个数字都是
1
,它是单个字节的单个
char

所以总数是100。如果您有包含两位数的
short int
s,比如
22
,那么大小将是200


作为替代方案,您可以使用或将数据强制转换为
char
s,它与您设置的
binary
标志一起写入数据,而不格式化数据。写RAW <代码> char < /C> > s时要记住的是,你必须考虑文件中有多少字节和


格式化的输出和输入通常更方便。作为使用原始
char
s写入文件的替代方法,最好查看您正在使用的。

short int
s以数字形式写入。每个数字都是
1
,它是单个字节的单个
char

所以总数是100。如果您有包含两位数的
short int
s,比如
22
,那么大小将是200


作为替代方案,您可以使用或将数据强制转换为
char
s,它与您设置的
binary
标志一起写入数据,而不格式化数据。写RAW <代码> char < /C> > s时要记住的是,你必须考虑文件中有多少字节和



格式化的输出和输入通常更方便。作为使用原始
char
s编写文件的替代方法,最好研究一下。

原因是-如前一个答案中的注释an所述-运算符
原因是-如前一个答案中的注释an所述-运算符
对二进制文件使用未格式化的输出函数,即。如果二进制文件要在其他平台中使用,也要考虑到Endianess
,如果
不能使用
outFile.write(&i,2),这不是你看到的吗@Barmar Umm,不,我没有,事实是我不知道。我以为设置ios::binary标志会做类似的事情。我的意思是使其非格式化,而不是使用字符串。如果二进制文件要在其他平台中使用,也要考虑到Endianess
,如果
不能使用
outFile.write(&i,2),这不是你看到的吗@Barmar Umm,不,我没有,事实是我不知道。我以为设置ios::binary标志会做类似的事情。我的意思是使其无格式,而不是使用字符串。谢谢。我认为设置ios::binary标志会使它起作用。“我对这件事真的一无所知。”蒂顿·莫里斯如果你仔细想想,那就意味着
操作员感谢你。我认为设置ios::binary标志会使它起作用。我真的对此一无所知。@TitoneMaurice如果你仔细想想,那就意味着
运算符,并且不需要将
auto
更改回
short int
的循环范围
auto
可以正常工作。我认为sizeof I是一个打字错误,因为它缺少括号。@TitoneMaurice语法是
sizeof expression
sizeof(type name)
。表达式可以用括号括起来,但不一定要用括号括起来,并且不需要在循环范围内将
auto
更改回
short int int
auto
可以正常工作。我认为sizeof I是一个打字错误,因为它缺少括号。@TitoneMaurice语法是
sizeof expression
sizeof(type name)
。表达式可以加括号,但不必加括号
std::ofstream outFile("myFile.raw", std::ios::binary | std::ios::out);

std::vector<short> list;
for (int i = 0; i < 100; ++i) list.push_back(1);
for (auto i : list) outFile.write((const char*)&i, sizeof(i));
outFile.close();

std::ifstream in("myFile.raw", std::ifstream::ate | std::ifstream::binary);
std::cout << "File size: " <<  in.tellg() << std::endl;
// prints out: File size: 200
in.close();