0

私はdouble[n][20]を持っていますが、nは最大200です。ファイルに保存するにはどうすればよいですか?

4

3 に答える 3

2

ANSI-Cで独自のファイル書き込みルーチンを作成するか、NSArrayのファイルへの書き込み機能を使用します。好みによって異なります。

NSArrayの保存

私は実際に、これがiOSプラットフォームで機能することを確認するためのコードスニペットを作成しました。私はここに穴のことを投稿するつもりです、そしてあなたはあなたが望むものを選んで選ぶことができます。基本的に、テスト用に5 x 5の静的配列を作成しましたが、どのサイズの配列でも機能します。これにより、ファイルをバイナリ形式で書き込む(元の倍精度を維持するための最も速い方法と最良の方法)と、それを読み戻すためのコードが提供されます。ご覧のとおり、UIViewControllerのviewDidLoadルーチンにメインコードを実装しました。配列をランダムで埋めました(実際には、ランドルーチンに静的79をシードしたためではありません)。

私が定義したヘッダーファイルで

double values[5][5];


- (void)viewDidLoad {
    [super viewDidLoad];

    NSBundle * myBundle = [NSBundle mainBundle];
    NSString * absPath  = [myBundle resourcePath];
    NSString * currPath;

    srand(79);

    FILE * aFile;
    currPath=[absPath stringByAppendingString: @"/myfile.bin"];
    if( NULL == ( aFile = fopen([currPath cStringUsingEncoding:[NSString defaultCStringEncoding]],"rb") ) ){

        //Generate some random doubles
        printf("generating 5 x 5 random values\r\n");
        for(int i = 0; i < 5; i++){

            for(int j = 0; j < 5; j++){
                values[i][j] = (double)rand() / (double)rand();
                printf("%.3f, ", values[i][j]);
            }
            printf("\r\n");
        }

        aFile = fopen([currPath cStringUsingEncoding:[NSString defaultCStringEncoding]],"wb");
        fwrite (values , 1 , sizeof(double) * 5 * 5 , aFile );
        fclose(aFile);

    }else{
        printf("File myfile.bin exists.  Reading in File.\r\n");
        fread(&values, sizeof(double), 5 * 5, aFile);
        for(int i = 0; i < 5; i++){

            for(int j = 0; j < 5; j++){
                printf("%.3f, ", values[i][j]);
            }
            printf("\r\n");
        }
        fclose(aFile);
    }

}

コードからの出力(コンソールウィンドウでは次のようになります)

generating 5 x 5 random values
0.002, 2.969, 0.298, 1.137, 0.790,
8.753, 0.884, 0.264, 0.034, 1.033, 
3.848, 1.049, 1.350, 0.402, 2.192, 
4.284, 0.979, 0.162, 1.294, 0.339, 
0.830, 0.175, 0.633, 1.008, 1.142, 

[Session started at 2012-06-02 03:56:44 +0000.]
File myfile.bin exists.  Reading in File.
0.002, 2.969, 0.298, 1.137, 0.790, 
8.753, 0.884, 0.264, 0.034, 1.033, 
3.848, 1.049, 1.350, 0.402, 2.192, 
4.284, 0.979, 0.162, 1.294, 0.339, 
0.830, 0.175, 0.633, 1.008, 1.142, 

お役に立てれば。

于 2012-06-02T01:59:34.650 に答える
1
#include <fcntl.h> // for open(), close()
#include <unistd.h> // for write()

int fd = open(path, O_WRONLY|O_BINARY); // system call
write(fd, d, sizeof(double)*n*20);
close(fd);

http://www.manpagez.com/man/2/open/

http://www.manpagez.com/man/2/write/

于 2012-06-02T01:58:35.883 に答える
1

次のようなものを試してください。

void writeData(double[][20] data, int n, const char name[]) {
    FILE* output = fopen(name, "w");
    int i, j;
    fprintf(output, "%d\n", n);
    for(i = 0; i < n; i++) {
        for(j = 0; j < 20; j++) {
            fprintf(output, "%lf\n", data[i][j]);
        }
    }
}

double** readData(const char name[]) {
    FILE* input = fopen(name, "r");
    int i, j, n;
    fscanf(input, "%d", &n);
    double** ret = (double**)malloc(n*sizeof(double*));
    for(int i = 0; i < n; i++) {
        ret[i] = (double*)malloc(20*sizeof(double));
        for(int j = 0; j < 20; j++) {
            fscanf(input, "%lf", &ret[i][j]);
        }
    }
    return ret;
}

参考までに、これはテストされていないコードですが、これを行う方法がわかるはずです。これは、最初の行に長さ(n)が含まれ、残りの行にdoubleが含まれている単純なテキストファイルです。

タグはdoubleを保持できるため、plistを使用することもできます。NSNumber * sを使用して、s内にネストされたdoubleを書き込みます。

void writeData(double** data, int n, const char name[]) {
    FILE* output = fopen(name, "w");
    int i, j;
    fprintf(output, "%d\n", n);
    for(i = 0; i < n; i++) {
        for(j = 0; j < LPCC_DIM; j++) {
            fprintf(output, "%lf\n", data[i][j]);
        }
    }
}

double** readData(const char name[], int* getN) {
    FILE* input = fopen(name, "r");
    int n;
    fscanf(input, "%d\n", &n);
    *getN = n;
    double** ret = (double**)malloc(n*sizeof(double*));
    for(int i = 0; i < n; i++) {
        ret[i] = (double*)malloc(LPCC_DIM*sizeof(double));
        for(int j = 0; j < LPCC_DIM; j++) {
            fscanf(input, "%lf", &ret[i][j]);
        }
    }
    return ret;
}
于 2012-06-02T02:10:13.690 に答える