0

我正在尝试使用 mmap 从文件中读取整数矩阵。如果我从 mmap 函数接收它作为 char 指针,我会看到一切正确,但如果我使用 int 指针,它会给我陈旧的数据。使用 char 指针的问题是我需要使用 strtok 或其他东西解析整个字符串并一一获取整数。我的矩阵大小将是 4k * 4k,因此对 sscanf 和 strtok 进行如此多的调用效率不高。请看程序和输出

#define INTS 3 * 3

int main()
{

    FILE* in = fopen("int_file", "rb");
    int* ints = (int*)mmap(0, INTS * sizeof(int),
                      PROT_READ, MAP_FILE | MAP_PRIVATE, fileno(in),0);
    fclose(in);
    for(int i = 0; i < INTS; ++i) { 
        std::cout << ints[i] << std::endl;
    }
    munmap(ints, INTS * sizeof(int));
    return 0;
}

int_file 的内容是

510 20 30 40 50 60 100 200 10000

输出

540029237 857747506 808716848 540030240 822751286 84097028

4

2 回答 2

2

正在打印文本的 ACSII 值。

你的文字看起来像:

510 20 30...

来自 ASCII 表(解释我想说的):

No.       ASCII (hex)

Space ->   20
0     ->   30
1     ->   31
2     ->   32
3     ->   33
5     ->   35

int大小为4字节,因此,取第一个4字节:

转换为 ASCII,在内存中"510 "给出(作为十进制)用于小端机器。同样,下一个字节给出(十进制)。这就是你得到的。"35 31 30 20"0x203031355400292374"20 3"0x33203032857747506

在这种情况下,您需要使用 atoi() 或类似方法将每个 ACSII 转换为整数。

但是您可以将整数存储为其二进制值本身,而不是将其保存为 ASCII。该文件不会是人类可读的,但它会达到您的目的。

于 2013-06-14T09:26:15.750 回答
0

int *如果文件中的数据通过calloc从int数组或连续内存中存储,则尽可能读取它。作家应该看起来像,

#include <iostream>
#include <sys/mman.h>
#include <stdio.h>

using namespace std;

int inst[] = {510, 20, 30, 40, 50, 60, 100, 200, 10000 };

#define INTS 3 * 3

int main()
{
        FILE* out = fopen("int_file", "wb");  // Error checks are needed
        char *ptr = (char *) inst;
        fwrite( ptr, sizeof( int ), INTS, out );
        fclose( out);
        return 0;
}

然后读者可以mmap像在你的代码中一样阅读,

#include <iostream>
#include <sys/mman.h>
#include <stdio.h>

using namespace std;

#define INTS 3 * 3

int main()
{

    FILE* in = fopen("int_file", "rb");    // Error checks are needed
    int* ints = (int*)mmap(0, INTS * sizeof(int),
                    PROT_READ, MAP_FILE | MAP_PRIVATE, fileno(in),0);
    fclose(in);
    for(int i = 0; i < INTS; ++i) {
            std::cout << ints[i] << std::endl;
    }
    munmap(ints, INTS * sizeof(int));
    return 0;
}

如果不是从数组或连续内存中存储,那么使用char *and strtokandatoi是最好的解决方案。

于 2013-06-14T09:56:13.023 回答