2011-08-30 72 views
0

我是C初学者,但在编程时不会太糟糕。我正在用C语言编写一个程序,它根据几个取决于时间的方程来计算一个对象的路径(x,y和z坐标)。然后我想打印这些坐标到一个输出文件,所以我可以绘制它们。现在,我有:将数字打印到C文件中?

double *t; 
double *x; 
double *y; 
double *z; 

我做我的计算,并填写x,y和z。然后,我尝试将它们打印到文件:

FILE *outputFile = fopen("path.out", "w"); 

for (i = 0; i<(sizeof(x)/sizeof(double)); ++i) 
    char *strX = (char *) *(x+i); 
    char *strY = (char *) *(y+i); 
    char *strZ = (char *) *(z+i); 
    fprintf(*outputFile, *strX); 
    fprintf(*outputFile, "\t"); 
    fprintf(*outputFile, *strY); 
    fprintf(*outputFile, "\t"); 
    fprintf(*outputFile, *strZ); 

我越来越想每个双转换为一个char *错误的整个混乱,但我不知道为什么。是否有更好的方法来打印双打或将它们转换为char *进行打印?

+0

您在“fprintf(* outputFile,”\ t“)fprintf(* outputFile,* strY)”之间缺少一个分号,您应该编辑以排列打印语句,使其更易于阅读。 – Jim

+0

感谢您的回应,但仍不能解决问题 – laplacian13

+1

您需要将该循环的主体放在大括号中。缩进并不意味着什么,这里只有第一行(带有'strX'的行)实际上在循环内。 –

回答

2

您正在使用需要格式规范的“fprintf”。

没有必要对指针铸造等,因为这是全部由fprintf函数根据打印出由制表符分隔三项双打,你只需要提供这样的格式处理:对

fprintf(outputFIle,"%lf\t%lf\t%lf",x + i, y + i, z + i); 

更多细节你可以在这里输入格式字符串: tutorial

+0

我不认为你的意思是* outputFile。 Plus x + i返回一个双精度指针,这也是不正确的。 – Erik

+0

一个小的更正 - 'outputFile'应该没有指针取消引用('*')。 'fprintf'已经收到'FILE *'第一个参数... –

+0

@Eli谢谢。修复了帖子。 –

1

我注意到t,x,y,z的类型是double *。有没有理由为什么这些需要成为指针?可能不会。除非你有很好的理由,否则你不应该在这段代码中使用指针。 (FILE *是好的,因为这是fopen的返回类型。)

此外,您不能只将一个double转换为char *,并期望它以字符串的形式写入文件。 fprintf()让你给它一个格式化的字符串输出。例如:fprintf(outputFile,“%f”,x);将会输出一个double。还要注意fprintf的第一个参数是FILE *类型的,所以你不需要取消引用它。

0
double *t; 
double *x; 
double *y; 
double *z; 

正如埃里克说,没有必要让这些指针,除非你想使它们指向其他变量或希望的malloc或释放calloc他们。你可以简单地做:

double t; 
double x; 
double y; 
double z; 

但是,这也是一个有点怪异:

for (i = 0; i<(sizeof(x)/sizeof(double)); ++i) 

你在哪里看到的?它有时被用来获得一个数组的项目数:

len = sizeof(myArray)/sizeof(myArray[0]); 

但x不是一个数组,在你的代码是一个指针,可能比双小,所以分工的结果是0并且机会很高,循环将不会运行。假设你的意思是整个缩进代码被循环,你也忘了{和}来包围块,所以循环只会执行那个“块”的第一行。

然后尝试出双入一个字符串(因此警告),而不是它是如何工作的,因为它只会尝试重新诠释的双重价值作为指针为char ,这当然不是你想要的,也是不必要的,因为fprintf会照顾的,对你:

fprintf(outputFile, "%f\t%f\t%f\n", x, y, z); 

环路和您正在使用指针的事实让我觉得你是在什么努力环,但并不完全清楚你实际想要达到什么。你能解释一下你真正想做什么吗?

+0

感谢您提供的所有帮助 - 我经历并纠正了{},现在理解了铸造问题。 它们是double *因为它们需要是数组来存储一堆坐标。我一直在阅读K&R,并认为它说的指针和数组基本上是一样的东西,但指针更好用。我应该做双x [1000]吗? – laplacian13

+0

是的!这样你就不用担心新的和删除指针了。而且,x [1]比*(x + 1)更简单。 – Erik

+0

@laplacian:如果你需要一个数组,使用一个数组。指针不是数组。指针是没有后备存储的简单变量,而数组是后盾。通过指针数学,人们可以假装指针是一个数组,但只有当它指向一个指针时才有效。你需要数组。 –