如何通过以下代码读取mnist文件。

时间:2016-07-10 04:49:01

标签: opencv c++11 mnist

我有一个关于阅读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;
}

1 个答案:

答案 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
}

使用用户定义的流操纵器的实现留给读者练习。