2011-03-16 26 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