【问题标题】:Printf to FprintfPrintf 到 Fprintf
【发布时间】:2011-03-16 16:44:16
【问题描述】:

我想用 sql 命令创建一个文件:

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),     "");
}

如果你能帮助我,非常感谢!

【问题讨论】:

  • 我不知道 fprintf,但是你仍然可以使用一些 char* 来存储你的语句,然后你可以写入一个文件。

标签: c printf


【解决方案1】:

您对NombreVersMots 的调用调用pw,后者调用printf(不是fprintf)。您可以通过将pw 中的printf 替换为fprintf 并让NombreVersMotspw 采用FILE* 参数来解决此问题,该参数将传递给fprintf

【讨论】:

  • 谢谢!它编译得很好,但在写入文件时会崩溃 (i.imgur.com/VVDK5.png)。我给你我的代码:pastebin.com/vA2jhvDz
  • @pihug12,在不知道它发生在哪里的情况下追踪它会非常耗时。我运行了你的代码,但它没有崩溃。一个提示:尝试简化。在这里,您复制并粘贴了一堆代码,而您本可以将其移动到一个函数中并为其提供 FILE* 参数并定义一次。现在你必须调试两次。
【解决方案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(long m) 使用printf 而不是fprintf。考虑修改它(特别是 pw 函数)以在内部也使用 fprintf,也可以将输出流作为参数添加到 NombreVersMots(long m)

    【讨论】:

    • 所以,我需要用 fprintf 而不是 printf 复制整个过程?
    • 这是一个解决方案。可能是最简单的。并将附加参数也添加到 NombreVesMots,以指定 fprintf 应该写入哪个流。
    • @pihug12,不,您不必复制程序,只需更改它即可。 printf(fmt, ...) 就像 fprint(stdout, fmt, ...)。将stdout 作为第一个示例的参数传递,将fichier 作为第二个示例的参数传递。
    • 谢谢!它编译得很好,但在写入文件时会崩溃 (i.imgur.com/VVDK5.png)。我给你我的代码:pastebin.com/vA2jhvDz
    • 存在剪切和粘贴错误,请查看第 66/67 行您与要打印的变量不匹配。
    猜你喜欢
    • 1970-01-01
    • 2011-06-05
    • 2012-10-27
    • 1970-01-01
    • 2019-10-28
    • 2015-03-27
    • 2011-12-28
    • 2023-04-09
    • 2016-08-12
    相关资源
    最近更新 更多