为什么连续的printf()没有给终端模拟器任何输出(前一个)



我试图在C中实现一个合并排序算法(学习(,但在调试过程中发现代码的奇怪行为。它可以编译(使用gcc(。然而,printf()函数的行为方式很奇怪。

在下面的代码中,第54行printf给出输出,但第58行中的下一个printf函数不给出输出。我知道代码中也有一些错误(比如infinte循环(,但现在不是重点。

我不明白为什么在第54行(函数main()中(之后不可能得到printf输出。我还试图在第55行中添加另一个printf,但没有成功。我在openSUSE Leap Linux上运行了可执行文件。

#include<stdio.h>
#include<stdlib.h>
struct Rider {
FILE *fp;
const char *filename;
int curr;
int next;
int eor;
};
void set_rider(const char *filename, const char *mode, struct Rider *rider_name) {
if ((rider_name->fp = fopen(filename,mode)) == NULL)
printf("File open for "%s" failed!n",filename), exit(1);
rider_name->filename = filename;
rider_name->curr = 0;
rider_name->next = 0;
rider_name->eor = 0;
}
void close_rider(struct Rider *rider_name) {
if (rider_name->fp != NULL)
if((fclose(rider_name->fp)) != 0)
printf("Closing of "%s" failed!n",rider_name->filename);
}
void show_sequence(struct Rider *rider_name) {
printf("%s:n",rider_name->filename);
while((rider_name->curr = fgetc(rider_name->fp))!= EOF) 
printf("%d,", rider_name->curr);
printf("n");
}
void copy_run(struct Rider *src, struct Rider *dest) {
if (src->eor == 1) {
fputc(src->next,dest->fp);
src->eor = 0;
}
while (src->eor != 1) {
if((src->curr = fgetc(src->fp)) != EOF) {
fputc(src->curr,dest->fp);
if((src->next = fgetc(src->fp)) < src->curr)
src->eor = 1;
else fputc(src->next,src->fp);
}
}
}

int main(void) {
int i = 0, seed=5, run_count = 0;
struct Rider r_tmp, r_a, r_b, r_c;
set_rider("c.txt", "w+", &r_c);
/* create initial pseudo-random sequence and store in file */
printf("Generated sequence %s:n", r_c.filename); //this prinftf() works
while ( i < 20) {
if (seed < 256) {
printf("%d,", seed); //this printf() not working already
fputc(seed, r_c.fp);
i++;
}
seed = (31*seed)% 997 + 5;
}
close_rider(&r_c); 
while ( run_count != 1) {
run_count = 0;
/* PHASE distribute c to a, b */ 
set_rider("c.txt","r+",&r_c);
set_rider("a.txt","w+",&r_a);
set_rider("b.txt","w+",&r_b);
while (r_c.curr !=EOF) {
copy_run(&r_c, &r_a);
if (r_c.eor != 1)
copy_run(&r_c,&r_b);
}
/* 
r_c.curr = fgetc(r_c.fp);
while ( r_c.curr != EOF) {
if ( r_c.eor == 1) {
r_tmp = r_a, r_a = r_b, r_b = r_tmp; 
fputc( r_c.curr, r_a.fp);
r_c.eor = 0;
}
else fputc( r_c.curr, r_a.fp);
r_c.next = fgetc(r_c.fp);
if ( r_c.next < r_c.curr) 
r_c.eor = 1;
r_c.curr = r_c.next;
}
*/ 
/*print the results */
/*close files to reset pointers esp. r_a.fp and r_b.fp which could be swapped */
/*maybe can be done without file closing.. */
close_rider(&r_a);
close_rider(&r_b);
close_rider(&r_c);
set_rider("c.txt","r+",&r_c);
set_rider("a.txt","r+",&r_a);
set_rider("b.txt","r+",&r_b);

show_sequence(&r_c);
show_sequence(&r_a);
show_sequence(&r_b);

/*close files */
close_rider(&r_a);
close_rider(&r_b);
close_rider(&r_c);

/* PHASE merge a, b into c */
/* open files for merge */
set_rider("c.txt","w+",&r_c);
set_rider("a.txt","r+",&r_a);
set_rider("b.txt","r+",&r_b);
r_a.curr = fgetc(r_a.fp);
r_b.curr = fgetc(r_b.fp);
while ( (r_a.curr != EOF) && (r_b.curr != EOF)) {
/*merge one run from each side */
while ((r_a.eor != 1) && (r_b.eor != 1)) { 
if ( r_a.curr <= r_b.curr ) {
fputc(r_a.curr, r_c.fp);
r_a.next = fgetc(r_a.fp);
r_a.eor = r_a.next < r_a.curr ? 1 : 0;
r_a.curr = r_a.next;
}
else {
fputc(r_b.curr, r_c.fp);
r_b.next = fgetc(r_b.fp);
r_b.eor = r_b.next < r_b.curr ? 1 : 0;
r_b.curr = r_b.next;
}
}
/* copy tails till eor */
while ( r_a.eor != 1) {
fputc(r_a.curr, r_c.fp);
r_a.next = fgetc(r_a.fp);
r_a.eor = r_a.next < r_a.curr ? 1 : 0;
r_a.curr = r_a.next;
}
r_a.eor = 0;
while ( r_b.eor != 1) {
fputc(r_b.curr, r_c.fp);
r_b.next = fgetc(r_b.fp);
r_b.eor = r_b.next < r_b.curr ? 1 : 0;
r_b.curr = r_b.next;
}
r_b.eor = 0;
run_count++;
}
/* copy tails till EOF */
if ( r_a.curr !=EOF)
run_count++;
if (r_b.curr != EOF)
run_count++;
while ( r_a.curr != EOF) {
fputc(r_a.curr, r_c.fp);
r_a.curr = fgetc(r_a.fp);
}
while ( r_b.curr != EOF) {
fputc(r_b.curr, r_c.fp);
r_b.curr = fgetc(r_b.fp);
}

rewind(r_c.fp);
show_sequence(&r_c);
/*close files */
close_rider(&r_a);
close_rider(&r_b);
close_rider(&r_c);
}
set_rider("c.txt","r", &r_c); 
printf("Final :n");
show_sequence(&r_c);
close_rider(&r_c);
return 0;
}

如果要确保在调用缓冲I/O函数后立即看到输出,则需要刷新相应的流。例如,使用fflush(stdout);

在任何情况下,您都需要尽量减少您的问题和/或使用调试器,特别是因为您知道同时还有其他问题。

最新更新