我有一个关于阅读MNIST数据集的问题。我了解了如何构建MNIST数据集。但是,我不知道如何通过以下代码阅读。你们中的一些人可能认为couts的结果是显而易见的(我把值写成评论)。但对我来说它没有意义,因为它在相同的输入下使用相同的精确函数四次,但每次都得到不同的输出。它怎么可能?如果我的问题有任何含糊之处,请告诉我。
谢谢。
代码开始:
typedef unsigned char BYTE;
int main()
{
...
FILE *fp = fopen("MNIST/train-images.idx3-ubyte", "rb");
// delcare function;
int magicNumber = readFlippedInteger(fp);
int numImages = readFlippedInteger(fp);
int numRows = readFlippedInteger(fp);
int numCols = readFlippedInteger(fp);
cout << magicNumber << endl; // 2051
cout << numImages << endl; // 60000
cout << numRows << endl; // 28
cout << numCols << endl; // 28
...
}
int readFlippedInteger(FILE *fp)
{
int ret = 0;
BYTE *temp;
temp = (BYTE*)(&ret);
fread(&temp[3], sizeof(BYTE), 1, fp);
fread(&temp[2], sizeof(BYTE), 1, fp);
fread(&temp[1], sizeof(BYTE), 1, fp);
fread(&temp[0], sizeof(BYTE), 1, fp);
return ret;
}
答案 0 :(得分:0)
除非绝对必要,否则请不要混用C和C ++。潜在的混淆是对fread
&#34;的调用移动&#34;文件指针通过该文件为您。正如@RetiredNinja所指出的那样,你一次将文件指针推进4个字节。这就是&#34;知道&#34;即使你没有明确告诉它,如何阅读下一个值。您可以阅读有关文件指针here的所有内容。
使用稍微更惯用的C ++的实现可能是
#include <fstream>
#include <iostream>
#include <algorithm>
int readFlippedInteger(std::istream &in) {
char temp[sizeof(int)];
in.read(temp, sizeof(int));
std::reverse(temp, temp+sizeof(int));
return *reinterpret_cast<int*>(temp);
}
int main() {
std::ifstream fin("MNIST/train-images.idx3-ubyte", std::ios::binary);
if (!fin) {
std::cerr << "Could not open file\n";
return -1;
}
// delcare function;
int magicNumber = readFlippedInteger(fin);
int numImages = readFlippedInteger(fin);
int numRows = readFlippedInteger(fin);
int numCols = readFlippedInteger(fin);
std::cout << magicNumber << std::endl // 2051
<< numImages << std::endl // 60000
<< numRows << std::endl // 28
<< numCols << std::endl; // 28
}
使用用户定义的流操纵器的实现留给读者练习。