我尝试打开.dat文件时出错

时间:2017-10-08 11:11:22

标签: c matlab

当我尝试在c代码中打开.dat文件时出现问题。可能我所犯的错误对你们中的一些人来说非常明显,但我无法找到它,所以我请求你的帮助。 我的代码的意思是打开包含12.000.000双数的.dat文件并将其存储在cuDoubleComplex数组中,该数组的大小为6.000.000个变量(.dat的偶数变量代表实部和奇数变量虚数(我的意思是顺序,而不是变量的值))

以下是我的代码摘录:

#include "cuComplex.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

int main(void)
{
    int n = 12000000; //12.000.000
    int lse = n / 2;
    double *data = (double *)malloc(12000000 * sizeof(double));
    double *data2 = (double *)malloc(12000000 * sizeof(double));
    FILE *f, *f2;
    cuDoubleComplex *se, *se2;

    f = fopen("ref_PRI20.dat", "r");
    fread(data, sizeof(double), n, f);
    fclose(f);

    f2 = fopen("surv_PRI20.dat", "r");
    fread(data2, sizeof(double), n, f2);
    fclose(f2);


    for (int a = 0; a < n; a++)
    {
        printf("%f\n", data2[a]);
    }


    se = (cuDoubleComplex*)malloc(lse * sizeof(cuDoubleComplex));
    se2 = (cuDoubleComplex*)malloc(lse * sizeof(cuDoubleComplex));
    for (int a = 0; a<n / 2; a++)
    {
        se[a].x = data[2 * a];
        se[a].y = data[2 * a + 1];
        se2[a].x = data2[2 * a];
        se2[a].y = data2[2 * a + 1];
    }  
free(data);
free(data2);

}

我添加了printf行和bucle只是为了检查,我得到的是&#34; 0,0000&#34;作为一种价值。虽然当我继续使用程序时,se和se2数组似乎得到随机值。 我知道数组的大小很大,但我需要使用这些数据。

我也试过在matlab工作,我没有错误。这是我在matlab中使用的代码,一切都很好所以我想.dat文件没有问题,只有我的代码。

f = fopen ("ref_PRI20.dat", 'r');

Data = fread (f, 12e6, 'double');
fclose (f);

dat=(Data(1:2:end)+1i*Data(2:2:end)).';

这里扫描输入数据,以便您可以看到格式。我希望它会有所帮助。

enter image description here

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

没有错误检查malloc或fopen的原始代码 由于评论说文件是在文本阅读器中打开的,并且在值之间有逗号,因此应该使用fscanf来输入值而不是fread。
由于必须一次扫描一个值,因此不需要数据或数据2指针。
无法编译,因为我没有cuComplex.h

greetingForm(Model model)

答案 1 :(得分:0)

以下提议的代码:

  1. 干净地编译
  2. 正确检查并处理错误
  3. 直接将数据读入结构。
  4. 未使用cuComplex.h文件,因为它不可用。
  5. 避免使用魔法&#39;编号
  6. 虽然&#39; b&#39;在linux / unix中没有必要,正确地将打开模式设置为BINARY READ
  7. 记录了为什么包含每个头文件。
  8. 消除了对malloc()
  9. 的所有不必要的变量和不必要的调用
  10. 消除了所有不必要的数据复制。
  11. 可能需要使用“移动窗口”来循环读取数据。直到读完12000000双打。如有必要,我会允许您添加该功能。
  12. 现在建议的代码:

    #include <stdio.h>   // fopen(), fread(), printf(), fprintf(), perror()
    #include <stdlib.h>  // exit(), EXIT_FAILURE, malloc(), free()
    
    
    #define N 12000000
    
    struct cuDoubleComplex
    {
        double x;
        double y;
    };
    
    int main(void)
    {
        struct cuDoubleComplex *data = malloc( (N>>1) * sizeof(double));
        if( !data )
        {
            perror( "malloc failed" );
            exit( EXIT_FAILURE );
        }
    
    
        struct cuDoubleComplex *data2 = malloc( (N>>1) * sizeof(double));
        if( !data2 )
        {
            perror( "malloc failed" );
            exit( EXIT_FAILURE );
        }
    
        FILE *f = fopen("ref_PRI20.dat", "rb");
        if( !f )
        {
            perror( "fopen failed" );
            free( data );
            free( data2 );
            exit( EXIT_FAILURE );
        }
    
        size_t nmemb = fread(data, sizeof(double), N, f);
        if( nmemb != N )
        {
            fprintf( stderr, "read of first file only read %lu doubles\n", nmemb );
            free( data );
            free( data2 );
            fclose( f );
            exit( EXIT_FAILURE );
        }
    
        fclose(f);
    
        FILE *f2 = fopen("surv_PRI20.dat", "rb");
        if( !f2 )
        {
            perror( "fopen failed" );
            free( data );
            free( data2 );
            exit( EXIT_FAILURE );
        }
    
        size_t nmemb2 = fread(data2, sizeof(double), N, f2);
        if( nmemb2 != N )
        {
            fprintf( stderr, "read of second file only read %lu doubles\n", nmemb2 );
            free( data );
            free( data2 );
            fclose( f2 );
            exit( EXIT_FAILURE );
        }
    
        fclose(f2);
    
        for (int a = 0; a < N; a++)
        {
            printf("%f\n", data2[a].y);
        }
    
    
        free(data);
        free(data2);
    } // end function: main