C++ 我正在尝试读取一个包含字符串和整数的二进制文件。。。并打印出与字符串对应的整数
我试图读取一个包含字符串和整数的二进制文件,并在同一行打印出与字符串(也称为its)对应的整数。我知道如何从二进制文件中读取整数,比如read(buffer,4),但我以前从未读取过字符串。实际上我不知道这些弦有多大。。100字节读取大部分文件,但不是全部。。。。文件格式如下所示 jcake 567 斯格瑞农17 我试着在名字后面抓取数字,并将它们打印到iostream中。我知道如何读取int,因为通常有4个字节。我只是从来没有读过有字符串的二进制文件C++ 我正在尝试读取一个包含字符串和整数的二进制文件。。。并打印出与字符串对应的整数,c++,string,file,binary,C++,String,File,Binary,我试图读取一个包含字符串和整数的二进制文件,并在同一行打印出与字符串(也称为its)对应的整数。我知道如何从二进制文件中读取整数,比如read(buffer,4),但我以前从未读取过字符串。实际上我不知道这些弦有多大。。100字节读取大部分文件,但不是全部。。。。文件格式如下所示 jcake 567 斯格瑞农17 我试着在名字后面抓取数字,并将它们打印到iostream中。我知道如何读取int,因为通常有4个字节。我只是从来没有读过有字符串的二进制文件 while (readfile.good(
while (readfile.good())
{
char*buffer = new char[100];
readfile.read(buffer, 100);
if (readfile.eof())
{
delete[] buffer;
break;
}
cout << buffer << endl;
while(readfile.good())
{
字符*缓冲区=新字符[100];
readfile.read(缓冲区,100);
if(readfile.eof())
{
删除[]缓冲区;
打破
}
cout在二进制文件中序列化字符串有许多不同的方法。最常用的方法是:
长度前缀字节序列,长度存储为整数值,长度通常为1、2或4字节,后跟数据本身,例如0x04 0x46 0x4F 0x4F 0x44
(0x04
=4字节,46,4F,4F,44==“FOOD”
)。由于声明了长度,因此不需要sentinel标记,这也允许在字符串中使用零字节。
1.1.有时使用可变长度整数,但这是一种高级技术
使用哨兵标记值,通常是NULL
'\0'
字符,例如0x46 0x4F 0x4F 0x44 0x00
或者,文件格式指定字符串具有固定长度,在这种情况下,不需要带内长度声明或sentinel,尽管有时规范会说,如果字符串的实际长度小于固定长度,则可以使用null'\0'
字节作为填充
您的问题没有涉及任何可能暗示您正在使用哪种格式的规范
请注意,如果您只想将整个文件读入内存,则应使用内存映射文件以获得更好的性能,尽管这需要平台支持。您可以使用Boost:
如果仍要将文件加载到缓冲区中,则需要分配一个足够大的缓冲区来容纳文件,而不希望使用静态分配的缓冲区(new char[100]
),因为如果文件大小小于100字节,则效率低下;如果文件大小大于100字节,则太小
如果使用的是ifstream
,请使用tellg()
方法获取文件长度,然后为其分配缓冲区:
using namespace std;
// ...
ifstream in( fileName, ifstream::ate | ifstream::binary );
streamsize length = in.tellg();
if( length <= 0 ) throw ...
size_t bufferLength = static_cast<size_t>( length );
char* buffer = new char[ bufferLength ];
in.read( buffer, bufferLength );
// do stuff with `buffer`
delete[] buffer;
使用名称空间std;
// ...
ifstream-in(文件名,ifstream::ate | ifstream::binary);
streamsize长度=in.tellg();
如果(长度通常在二进制文件中存储可变长度数据的长度。是可变长度还是固定长度?您有格式规范吗?如果没有文件格式规范作为参考,您无法编写程序来读取文件。您有这样的规范吗?文件格式为jdow 567/nsgren 7654名称和数字各在一行您描述的文件是一个文本文件。是什么让您认为它是二进制的?扩展名不重要,重要的是文件的内容。谢谢您,MCUH!!!我应该知道使用tell and seek命令获取文件l英译汉1.我很感激你1.我比你投的票高,但我没有足够的代表权让它表现出来=*(