C 尝试打开.dat文件时出错
我在尝试用c代码打开.dat文件时遇到问题。也许我犯的错误对你们中的一些人来说很明显,但我找不到,所以我请求你们的帮助。 我的代码的要点是打开包含12.000.000个双精度数字的.dat文件,并将其存储在cuDoubleComplex数组中,该数组的大小将为6.000.000个变量(.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
#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
malloc()的不必要调用
#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时,我的问题完全解决了,非常感谢。