【问题标题】:fprintf starts printing with strange characters then proceeds to print normallyfprintf 开始打印奇怪的字符,然后继续正常打印
【发布时间】:2020-03-16 23:47:38
【问题描述】:

我在尝试使用 fprintf() 写入文件时遇到了问题。当我开始写入文件时,前几行由半随机无效字符组成,之后其余部分正常打印。我不知道是什么导致了这个问题。下面是产生问题的代码。

调用的函数:

double calc_time(clock_t s, clock_t e){
    return ((double)(e-s) / (sysconf(_SC_CLK_TCK)));
}

void print_times(FILE *f, char *operation, clock_t s, clock_t e, struct tms *st, struct tms *et){
    printf("%s", operation);
    printf("\nREAL TIME: %f\n", calc_time(s,e));
    printf("USER TIME: %f\n", calc_time(st->tms_utime,et->tms_utime));
    printf("SYS TIME: %f\n", calc_time(st->tms_stime,et->tms_stime));
    printf("HERE");
    fprintf(f,"%s", operation);
    fprintf(f,"\nREAL TIME: %fl", calc_time(s,e));
    fprintf(f,"\nUSER TIME: %fl", calc_time(st->tms_utime,et->tms_utime));
    fprintf(f,"\nSYS TIME: %fl", calc_time(st->tms_stime,et->tms_stime));
}

打印在这里进行:

    f = fopen("raport2.txt","a");

    clock_t r_times[2];
    struct tms* t_times[2];
    t_times[0] = calloc(1,sizeof(struct tms));
    t_times[1] = calloc(1,sizeof(struct tms));

    r_times[0] = times(t_times[0]);

    struct block_array* array = create(4);
    r_times[1] = times(t_times[1]);

    print_times(f, "\nCreating array", r_times[0], r_times[1], t_times[0], t_times[1]);

    r_times[0] = times(t_times[0]);

    struct file_sequence seq = seq_def("t1.txt t2.txt b1.txt b2.txt");
    char *tmp = compare(seq);
    create_blocks(array,tmp,4);
    r_times[1] = times(t_times[1]);

    print_times(f,"\nCreating blocks",r_times[0],r_times[1],t_times[0],t_times[1]);

    r_times[0] = times(t_times[0]);

    delete_block(array,1);
    delete_block(array,2);
    delete_block(array,3);
    delete_block(array,4);
    r_times[1] = times(t_times[1]);

    print_times(f, "\nDeleting blocks", r_times[0], r_times[1], t_times[0], t_times[1]);

【问题讨论】:

  • t_times[0] = calloc(1,sizeof(struct tms)); ... r_times[0] = times(t_times[0]); 很奇怪。向times() 发送一个充满零的struct tms 有什么意义?您的意思是times(&t_times[0]); 如果是这样,请启用所有警告并节省时间。
  • 请注意,您正在附加到文件中。你确定你每次都得到了垃圾字符,而不仅仅是查看程序之前运行的剩余内容?
  • 你能创建一个minimal reproducible example吗?
  • 更具体地说,它总是第一次调用 print_times tahat 打印无效字符,即使我从一个新的空文件开始,也会出现问题。我也尝试更改为times(&t_times[0]),这产生了有关不兼容指针类型的警告。
  • 这是为我重现问题的代码:github.com/KonradPR/fprintf_problem

标签: c file printf


【解决方案1】:

该错误是由与 sn-ps 中提供的代码不同的部分引起的(尽管 github 源代码仍会重现它)。事实证明,在程序的不同部分,我正在写入一个文件而不删除它以前的内容(我认为touch 会这样做),然后从文件中检索到的数据导致内存泄漏和各种分配问题。

【讨论】:

    【解决方案2】:

    使用%lf 打印双打,而不是您使用的拼写错误%fl

    【讨论】:

    • 这个错字仅仅意味着这些值将在它们后面打印一个l(小写的ell)。 %f%lf 都是打印double 的正确格式——并且没有办法打印float,因为它们总是按照调用像fprintf() 这样的可变参数函数的规则转换为double
    猜你喜欢
    • 1970-01-01
    • 2015-01-26
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多