Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++_Objective C_Ipad_Objective C++_Ifstream - Fatal编程技术网

C++ 如何将文件中的字节提取为简单的数据类型?

C++ 如何将文件中的字节提取为简单的数据类型?,c++,objective-c,ipad,objective-c++,ifstream,C++,Objective C,Ipad,Objective C++,Ifstream,我想尽一切办法都试过了,但什么都没用。我有一个用VB.Net编写的二进制文件,它基本上由一个整数组成,(当然是二进制的),它告诉我以下数据的数组大小,然后浮点数作为二进制数据。该文件从VB .NET中写入很好,我可以通过VisualC++来读回它,只是使用下面的代码: ifstream output("c:\\out.ipv", ios::in | ios::binary); UInt32 len; UInt32 *ptr2 = (UInt32*)&len; output.read((c

我想尽一切办法都试过了,但什么都没用。我有一个用VB.Net编写的二进制文件,它基本上由一个整数组成,(当然是二进制的),它告诉我以下数据的数组大小,然后浮点数作为二进制数据。该文件从VB .NET中写入很好,我可以通过VisualC++来读回它,只是使用下面的代码:

ifstream output("c:\\out.ipv", ios::in | ios::binary);
UInt32 len;
UInt32 *ptr2 = (UInt32*)&len;
output.read((char*)ptr2, 4);
这将返回正确的值456780,字节为:76248,6,0。当我在iPad上运行完全相同的代码时,我得到了1043089572。如果我使用以下替代方法:

NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
UInt32 num;
const NSRange numV = {0, 4};
[data getBytes:&num range:numV];

这段代码返回一个不同的值124724,我不知道如何读取从文件中提取的确切字节。这是另一件我一直想弄明白但却无法工作的事情。你知道为什么在Visual C++中使用相同的方法在iPad上不能工作吗?这件事我真是不知所措

这听起来像是一个endian问题。您可以使用
中的任何函数以指定的端点读取数据。在您的情况下,您可能需要执行以下操作

NSInputStream *istream = [NSInputStream inputStreamWithFileAtPath:filePath];
UInt32 num = 0;
if (istream) {
    uint8_t buffer[4];
    if ([istream read:buffer maxLength:4] == 4) {
        num = OSReadLittleInt32(buffer, 0);
    } else {
        // there weren't 4 bytes in the file
    }
} else {
    // the file could not be opened
}

好吧,我的数据有点奇怪。我只看了Visual C++和Objto-C中的原始字节值,它们根本不一致。我只读取文件的前四个字节并查看它们的值。我假设在这一点上,我没有正确地阅读它们,但我不知道我在这里遗漏了什么。我用的Visual C++代码查看字节值如下:

ifstream input("c:\\out.ipv", ios::in | ios::binary);
Byte tmp[4];
input.read((char*)&tmp[0], 4);
tmp数组中的值为:

76
248
6
0
如果我在objective-c中做同样的事情:

ifstream input([filePath UTF8String], ios::in | ios::binary);
Byte tmp[4];
input.read((char*)&tmp[0], 4);
我得到:

164
72
44
62
有什么好处?我至少希望得到相同的字节值。包含我遇到问题的四个字节的文件位于此处:

编辑:

我意识到164,72,44,62字节值来自何处:这些是字节数组在我放入任何内容之前的初始值。出于某种原因,该行:

input.read((char*)&tmp[0], 4);
他什么也没做。知道为什么它没有像应该的那样从文件中读取吗

最终编辑:


好吧,我可能不应该发布这个问题的答案,因为这会让我看起来很傻,但我不想让任何阅读这些帖子的人感到困惑。因此,数组和对象总是返回相同的值,无论发生什么情况,这也恰好是它们在分配时拥有的值。我的文件名中有一个太多的,所以它试图读入..ipv而不是读入.ipv。一旦我修复了文件名,一切都按照我预期的方式运行。很抱歉造成混淆,谢谢大家的帮助。

我尝试了这个,但它仍然给了我与原始数字无关的值。我相信我的问题可能与我在下面的新帖子中所解释的更为密切相关。感谢您跟进并更新您的问题解决方案。提供完整的解决方案对于StackOverflow社区来说是非常好的。不过有一个小细节:你应该编辑你的原始问题,提供你尝试过的事情的更新,而不是发布一个新的“答案”来提供更新。把问题放在一起,只在答案部分有真正的答案,这既是好的形式,也是正常的做法。也就是说,提供您自己的问题答案(就像您在最终编辑时所做的那样)是绝对可以的,甚至是值得称赞的。