我不知道为什么或如何,但我重复检查代码,它崩溃,这是生成de crash的代码的一个例子,我没有得到它。 我一直在处理有关此事的其他问题,但尝试人们提供的解决方案仍然无效。我试图阅读的那种txt是这样的:
0 0 -1.000047e + 000
0 1 -1.000047e + 000
0 2 -1.000047e + 000
0 3 -1.000047e + 000
0 4 -1.000047e + 000
0 5 -1.000047e + 000
1 0 -1.000047e + 000
1 1 -1.000047e + 000
并且我的代码提取失败了,我没有任何关于到达文件末尾或类似的任何问题/因为我总是知道有多少值有.txt我必须阅读(它是由我之前编写的程序创建的,就像我对C的新方式一样):
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
const int Nx=88; // lattice size X
const int Ny=44; // lattice size Y
double *phi;
int main() {
int i, j, ki, kj, index;
FILE * conf;
FILE * fp;
fp = fopen ("test.txt","w+");
conf = fopen ("InitConditions.txt", "r"); /* open the file for reading */
ki=0;
kj=0;
for (i=0; i<Nx; i++){
for (j=0; j<Ny; j++){
index=get_index(i,j);
printf("%i",index);
fscanf(conf,"%i %i %lf", &ki, &kj, &phi[index]);
}
}
return (0);
}
int get_index(int i, int j){
int index;
index=i*Ny+j;
return index;
}
错误类似于
处理终止,状态为-1073741819(0分钟,7秒)
我不明白
答案 0 :(得分:2)
fscanf()
,因为您在那里使用&phi[index]
而崩溃,但phi
未指向您已分配的内存。
您需要先分配所需的内存。
if((phi = malloc(Nx * Ny * sizeof(double))) == NULL) { /* Allocate memory */
/* Error handling code */
exit(1);
}
/* ... */
/* ... */
for (i=0; i<Nx; i++) {
for (j=0; j<Ny; j++) {
index=get_index(i,j);
printf("%i",index);
if (fscanf(conf,"%i %i %lf", &ki, &kj, &phi[index]) != 3) {
/* Code to handle fscanf failure */
}
}
}
/* .... */
/* .... */
free(phi); /* Free the allocated memory when it is not needed anymore */
答案 1 :(得分:1)
很难准确说出你想要完成的事情。您的主要问题是尝试使用未初始化的未初始化指针phi
。由于您知道元素的最大数量,并且它们是合理的数字,因此只需声明phi[Nx * Ny]
并使用自动存储。
但是,大多数其他错误都是由于无法验证您的任何文件打开或从文件中读取而导致的。如果您的文件确实包含您显示的空行,则建议您使用fscanf
尝试将文件读取/解析为实际值。您可以使用临时值,但使用fgets
将每行读入缓冲区,然后解析缓冲区以提取所需的数据,可以提供更好的服务。这将读取与转换次数的测试分开,从而在测试行和解析值时具有更大的灵活性。
将这些部分放在一起并注释掉未使用的代码和头文件,您可以执行以下操作:
#include <stdio.h>
enum { Ny = 44, Nx = 88, MAXC = 128 }; /* constants */
int get_index (int i, int j);
int main (int argc, char **argv)
{
int i, j, ki, kj, index;
double phi[Nx * Ny] = { 0.0 };
char buf[MAXC] = "";
FILE *conf/*, *fp*/;
/*
if (!(fp = fopen (argc > 1 ? argv[1] : "test.txt", "w+"))) {
fprintf (stderr, "error: output file open failed.\n");
return 1;
} */
if (!(conf = fopen (argc > 2 ? argv[2] : "InitConditions.txt", "r"))) {
fprintf (stderr, "error: input file open failed.\n");
return 1;
}
i = j = ki = kj = index = 0;
for (i = 0; i < Nx; i++) { /* for each i */
for (j = 0; j < Ny; j++) { /* for each j */
index = get_index (i, j); /* compute index */
while (fgets (buf, MAXC, conf)) { /* read line into buf */
int tmpki, tmpkj; /* tmp vars to hold values */
double tmpphi;
/* if line holds 3 values, then assign to array */
if (sscanf (buf, "%d %d %lf", &tmpki, &tmpkj, &tmpphi) == 3) {
ki = tmpki;
kj = tmpkj;
phi[index] = tmpphi;
/* test print */
printf (" phi[%4d] : %.6le\n", index, phi[index]);
break;
}
}
}
}
return 0;
}
int get_index (int i, int j)
{
int index;
index = i * Ny + j;
return index;
}
(注意:,因为您要循环i
和j
,您必须强制每次迭代读取1
个值集。使用{{1并且在成功解析值时打破读取可以实现此目的。)
示例使用/输出
while (fgets...
仔细看看,如果您有任何疑问,请告诉我。如果我错过了你问题的逻辑,请告诉我,我很高兴与你合作。