【发布时间】: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