2011-08-30 76 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:如果你需要一個數組,使用一個數組。指針不是數組。指針是沒有後備存儲的簡單變量,而數組是後盾。通過指針數學,人們可以假裝指針是一個數組,但只有當它指向一個指針時纔有效。你需要數組。 –