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

C 尝试打开.dat文件时出错,c,matlab,C,Matlab,我在尝试用c代码打开.dat文件时遇到问题。也许我犯的错误对你们中的一些人来说很明显,但我找不到,所以我请求你们的帮助。 我的代码的要点是打开包含12.000.000个双精度数字的.dat文件,并将其存储在cuDoubleComplex数组中,该数组的大小将为6.000.000个变量(.dat的偶数变量表示实部,奇数变量表示虚部(我指的是顺序,而不是变量的值)) 以下是我的代码摘录: #include "cuComplex.h" #include <stdio.h> #include

我在尝试用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);

}
这里是输入数据的扫描,以便您可以查看格式。我希望这会有帮助


任何帮助都将不胜感激。

以下建议代码:

#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
  • 干净地编译
  • 正确检查并处理错误
  • 将数据直接读取到结构中
  • 未使用cuComplex.h文件,因为该文件不可用
  • 避免使用“神奇”数字
  • 虽然在linux/unix中不需要“b”,但请将打开模式正确设置为二进制读取
  • 记录包含每个头文件的原因
  • 消除了所有不必要的变量和对
    malloc()的不必要调用
  • 消除了所有不必要的数据复制
  • 可能需要在循环中读取数据,使用“移动窗口”,直到读取12000000个双倍。如果有必要,我会让您添加该功能
  • 现在建议的守则是:

    #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
    
    #包括//fopen()、fread()、printf()、fprintf()、perror()
    #包括//exit()、exit_FAILURE、malloc()、free()
    #定义N 12000000
    结构复合物
    {
    双x;
    双y;
    };
    内部主(空)
    {
    struct cuDoubleComplex*data=malloc((N>>1)*sizeof(double));
    如果(!数据)
    {
    perror(“malloc失败”);
    退出(退出失败);
    }
    struct cuDoubleComplex*data2=malloc((N>>1)*sizeof(double));
    如果(!data2)
    {
    perror(“malloc失败”);
    退出(退出失败);
    }
    文件*f=fopen(“ref_PRI20.dat”、“rb”);
    如果(!f)
    {
    perror(“fopen失败”);
    免费(数据);
    免费(数据2);
    退出(退出失败);
    }
    size_t nmemb=fread(数据,sizeof(double),N,f);
    如果(nmemb!=N)
    {
    fprintf(stderr,“仅读取第一个文件的%lu加倍”,nmemb);
    免费(数据);
    免费(数据2);
    fclose(f);
    退出(退出失败);
    }
    fclose(f);
    文件*f2=fopen(“surv_PRI20.dat”、“rb”);
    if(!f2)
    {
    perror(“fopen失败”);
    免费(数据);
    免费(数据2);
    退出(退出失败);
    }
    尺寸nmemb2=fread(数据2,尺寸f(双),N,f2);
    如果(nmemb2!=N)
    {
    fprintf(stderr,“仅读取第二个文件%lu双精度”,nmemb2);
    免费(数据);
    免费(数据2);
    fclose(f2);
    退出(退出失败);
    }
    fclose(f2);
    对于(int a=0;a
    检查malloc或fopen的原始代码时没有错误。
    因为有评论说文件是在文本读取器中打开的,并且值之间有逗号,所以应该使用fscanf而不是fread来输入值。
    由于必须一次扫描一个值,因此不需要数据或数据2指针。
    无法编译此文件,因为我没有cuComplex.h

    #include "cuComplex.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    
    int main(void)
    {
        int n = 12000000; //12.000.000
        int lse = n / 2;
        FILE *f, *f2;
        cuDoubleComplex *se, *se2;
    
        f = fopen("ref_PRI20.dat", "r");
    
        f2 = fopen("surv_PRI20.dat", "r");
    
        se = malloc(lse * sizeof(cuDoubleComplex));
        se2 = malloc(lse * sizeof(cuDoubleComplex));
        for (int a = 0; a < lse; a++)
        {
            if ( 1 != fscanf ( f, "%lf ,", &se[a * 2].x])) {
                fprintf ( stderr, "could not scan double\n");
                break;
            }
            if ( 1 != fscanf ( f, "%lf ,", &se[a * 2 + 1].y)) {
                fprintf ( stderr, "could not scan double\n");
                break;
            }
            if ( 1 != fscanf ( f2, "%lf ,", &se2[a * 2].x)) {
                fprintf ( stderr, "could not scan double\n");
                break;
            }
            if ( 1 != fscanf ( f2, "%lf ,", &se2[a * 2 + 1].y)) {
                fprintf ( stderr, "could not scan double\n");
                break;
            }
        }  
        fclose(f);
        fclose(f2);
        free ( se);
        free ( se2);
        return 0;
    }
    
    #包括“cuComplex.h”
    #包括
    #包括
    #包括
    内部主(空)
    {
    int n=12000000;//12.000.000
    int lse=n/2;
    文件*f,*f2;
    铜配合物*se,*se2;
    f=fopen(“参考基准日”,“r”);
    f2=fopen(“surv_PRI20.dat”,“r”);
    se=malloc(lse*sizeof(cuDoubleComplex));
    se2=malloc(lse*sizeof(cuDoubleComplex));
    对于(int a=0;a
    您好,我已经阅读了您链接的帖子,但老实说,我不知道这对我有什么帮助。如果你确定这就是解决方案,你能帮我应用它吗?谢谢。在这里,我刚刚检查了你所说的一切,看起来都很好。关于:<代码>包含了<代码>,标题文件是C++的,不是C。建议你删除那个声明。当调用<代码> fOpen-()/>代码时,总是检查(=!NULL)返回的值,以确保操作成功。
    ,始终将返回值与第三个参数进行比较,以确保读取了所有所需的数据。您好,在此之前,我对延迟响应表示抱歉。你是对的,当我把fread换成fscanf时,我的问题完全解决了,非常感谢。