Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我正在尝试读取一个包含字符串和整数的二进制文件。。。并打印出与字符串对应的整数_C++_String_File_Binary - Fatal编程技术网

C++ 我正在尝试读取一个包含字符串和整数的二进制文件。。。并打印出与字符串对应的整数

C++ 我正在尝试读取一个包含字符串和整数的二进制文件。。。并打印出与字符串对应的整数,c++,string,file,binary,C++,String,File,Binary,我试图读取一个包含字符串和整数的二进制文件,并在同一行打印出与字符串(也称为its)对应的整数。我知道如何从二进制文件中读取整数,比如read(buffer,4),但我以前从未读取过字符串。实际上我不知道这些弦有多大。。100字节读取大部分文件,但不是全部。。。。文件格式如下所示 jcake 567 斯格瑞农17 我试着在名字后面抓取数字,并将它们打印到iostream中。我知道如何读取int,因为通常有4个字节。我只是从来没有读过有字符串的二进制文件 while (readfile.good(

我试图读取一个包含字符串和整数的二进制文件,并在同一行打印出与字符串(也称为its)对应的整数。我知道如何从二进制文件中读取整数,比如read(buffer,4),但我以前从未读取过字符串。实际上我不知道这些弦有多大。。100字节读取大部分文件,但不是全部。。。。文件格式如下所示

jcake 567 斯格瑞农17

我试着在名字后面抓取数字,并将它们打印到iostream中。我知道如何读取int,因为通常有4个字节。我只是从来没有读过有字符串的二进制文件

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.我比你投的票高,但我没有足够的代表权让它表现出来=*(