2011-03-16 24 views
0

我想創建一個SQL命令的文件:printf的fprintf中到

CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100)); 
INSERT INTO t1 VALUES(1,13153,'thirteen thousand one hundred fifty three'); 
INSERT INTO t1 VALUES(2,75560,'seventy five thousand five hundred sixty'); 
... 995 lines omitted 
INSERT INTO t1 VALUES(998,66289,'sixty six thousand two hundred eighty nine'); 
INSERT INTO t1 VALUES(999,24322,'twenty four thousand three hundred twenty two'); 
INSERT INTO t1 VALUES(1000,94142,'ninety four thousand one hundred forty two'); 

它工作時,我用printf:

printf("INSERT INTO t1 VALUES(%d, %d, '", i, nbAlea); 
NombreVersMots(nbAlea); 
printf("');\n"); 

但我不能用fprintf中:

fprintf(fichier, "INSERT INTO t1 VALUES(%d, %d, '", i, nbAlea); 
fprintf(fichier, NombreVersMots(nbAlea)); // <- HERE IS MY PROBLEM 
fprintf(fichier, "');\n"); 

我找不到使用第二行的方法。

我給你的,你的程序需要他們:

char *one[]={"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"}; 
char *ten[]={"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}; 
void pw(long n,char ch[]) 
{ 
    if(n>19) 
    { 
     printf("%s %s ",ten[n/10],one[n%10]); 
    } 
    else 
    { 
     if(n) // pour eviter les espaces inutiles quand la boucle n'affiche rien 
     { 
      printf("%s ",one[n]); 
     } 
    } 
    if(n) 
    { 
     printf("%s",ch); // affiche 'million', 'thousand' ou 'hundred' 
    } 
} 

void NombreVersMots(long m) 
{ 
    pw((m/1000000),  "million "); 
    pw(((m/100000)%10), "hundred "); 
    pw(((m/1000)%100), "thousand "); 
    pw(((m/100)%10), "hundred "); 
    pw(((m/1)%100),  ""); 
} 

非常感謝,如果你能幫幫我!

+0

我不知道fprintf,但你仍然可以使用一些char *來存儲你的語句,然後你可以寫入一個文件。 – 2011-03-16 08:40:57

回答

0

好的問題是,內部NombreVersMots(long m)使用printf而不是fprintf。考慮修改它(尤其是pw函數)以在內部也使用fprintf,也可以將輸出流作爲參數添加到NombreVersMots(long m)

+0

所以,我需要複製整個過程與fprintf而不是printf? – pihug12 2011-03-16 08:42:13

+0

這是一個解決方案。可能是最簡單的。並將附加參數添加到NombreVesMots,以指定fprintf應寫入哪個流。 – 2011-03-16 08:43:57

+0

@ pihug12,不,你不必複製程序,只需改變它。 'printf(fmt,...)'就像'fprint(stdout,fmt,...)'。在第二個例子中,將'stdout'作爲第一個例子的參數並將'fichier'作爲參數。 – rlibby 2011-03-16 08:46:47

2

重寫NombreVersMots使用fprintf(),並接受FILE *參數。然後,如果您想在頂層使用printf,請使用stdout作爲參數進行調用。即:

void pw(FILE *file, long n, char ch[]) 
{ 
    ... 
    fprintf(file, "blah"); 
} 

void NombreVersMots(FILE *file, long m) 
{ 
    pw(file, (m/10000000), "million); 
} 

NombreVersMots(fichier, 42); // As before 
NombreVersMots(stdout, 43); // To stdout 
3

您的來電呼叫NombreVersMots其中pw調用printf(不fprintf)。您可以通過將printf替換爲pwfprintf並且讓NombreVersMotspwFILE*參數,將其傳遞到fprintf來解決此問題。

+0

謝謝!它編譯的很好,但是它在寫入文件時會崩潰(http://i.imgur.com/VVDK5.png)。我給你我的代碼:http://pastebin.com/vA2jhvDz – pihug12 2011-03-16 09:06:01

+0

@ pihug12,追蹤這些信息非常費時,甚至不知道它在哪裏發生。我運行了你的代碼,但沒有崩潰。儘管如此:儘量簡化。在這裏,您可以複製並粘貼一堆代碼,只需將它移動到一個函數中並給它一個FILE *參數並定義一次即可。現在你必須調試兩次。 – rlibby 2011-03-16 09:22:05