私は演習を行っています。32 ビットのリトル エンディアン マシンで次のようなバイナリ ファイルを読み取る必要があります。
30002000100020003000400050006000
この種類のファイルは、int 要素を持つマトリックスを記述します。最初の 2 つの整数 (3000 と 2000) は、行列の行と列の次元を表します。
私はいくつかの問題を抱えているので、デバッグを始めました。
c = read(fd, &a, sizeof(int));
通常のintではなく、808464435のような奇妙な値を書き込みます.64ビットマシン、Fedora 18でプログラミングしていますが、
printf("%d\n", sizeof(int));
そのintはまだ4バイトです。
ここに完全なコード
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int openFile(const char* path)
{
int fd;
fd = open(path, O_RDONLY);
if(fd == -1)
{
perror("error in file opening\n");
exit(EXIT_FAILURE);
}
return fd;
}
int readInt(int fd)
{
int a,c;
c = read(fd, &a, sizeof(int));
if(c == -1)
{
perror("error in read\n");
exit(EXIT_FAILURE);
}
return a;
}
void fillMatrix(int fd,int* matrix, int* rows, int* columns)
{
*rows = readInt(fd);
*columns = readInt(fd);
matrix = calloc(((*rows) * (*columns)) + 1, sizeof(int));
for(int i = 1; i <= (*rows) * (*columns); i++)
{
matrix[i] = readInt(fd);
}
}
int main(int argc, char* argv)
{
printf("%d\n", sizeof(int));
exit(EXIT_SUCCESS);
int fdA;
int rowsA, columnsA;
int *matrixA;
fdA = openFile("/home/caterpillar/workspace/18Luglio2012/src/matrixA.txt");
fillMatrix(fdA, matrixA, &rowsA, &columnsA);
for(int i = 1; i <= rowsA * columnsA; i++)
{
printf("%d ", matrixA[i]);
}
close(fdA);
return 0;
}