为什么输出完内容后还在输出光标还在向下移哪里出了问题


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN 80
#define GROW 160
char* s_gets(char* st, int n);
int main() {
    FILE* fp, * fs;
    char file_app[LEN];
    char file_src[LEN];
    int count,ch;
    int i, k;
    int    a=0,b=0;
    errno_t err;
    puts("请输入第一个文件名:");
    s_gets(file_app, LEN);
    puts("请输入第二个文件名:");
    s_gets(file_src, LEN);
    if ((err = fopen_s(&fp, file_app, "r")) != 0) {
        fprintf(stderr, "不能打开文件\n");
        exit(EXIT_FAILURE);
    }
    if ((err = fopen_s(&fs, file_src, "r")) != 0) {
        fprintf(stderr, "不能打开文件\n");
        exit(EXIT_FAILURE);
    }
    fseek(fp, 0L, SEEK_END);/*将指针移到文件末尾*/
    fseek(fs, 0L, SEEK_END);
    i = ftell(fp);/* 计算文件字节数*/
    k = ftell(fs);
    rewind(fp);
    rewind(fs);

    while (a<=i&&b<=k) {
        if ((a<i)&&(count = getc(fp))) {/*将第一个文件第一行输出*/
            putchar(count);
            a++;
        }
            if ((b<k)&&((count == '\n')||(feof(fp)==EOF))) {/*输出第二个文件的第一行*/
                while (ch = getc(fs)) {
                    putchar(ch);
                    b++;
                    if ((feof(fp) == EOF) && (feof(fs) == EOF)) {/*到文件末尾跳出循环*/
                        break;
                        break;
                    }
                    if (ch == '\n')
                        break;
                }
    
            }
    }
    fclose(fp);
    fclose(fs);
    printf("成功\n");
    return 0;
}
char* s_gets(char* st, int n) {/*输入文件名字*/
    char* ret_val, * find;
    ret_val = fgets(st, n, stdin);
    if (ret_val) {
        find = strchr(st, '\n');
        if (find)
            *find = '\0';
        else
            while (getchar() != '\n')
                continue;
    }
    return ret_val;
}

img

img

用ftell获取的文件大小有时候是比你实际读取的数据个数大的,所以,你的while循环里,不要用a<i && b<k,改成 (!feof(fs)) && (!feof(fp)) 判断。
if条件里的 a < i 和 b < k也改成用 feof()函数来判断。

【以下回答由 GPT 生成】

问题原因: 在代码中,光标向下移动的问题是由于putchar()函数在输出字符后会自动将光标移动到下一个字符位置,导致光标继续向下移动。此外,还有一个问题是在读取第二个文件的第一行时,使用了错误的文件指针。

解决方案: 为了停止光标的移动,可以使用其他方法代替putchar()函数进行输出,比如使用printf()函数。 此外,在读取第二个文件的第一行时,应该使用正确的文件指针(fs)。

下面是修改后的代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN 80
#define GROW 160

char* s_gets(char* st, int n);

int main() {
    FILE* fp, * fs;
    char file_app[LEN];
    char file_src[LEN];
    int count, ch;
    int i, k;
    int a = 0, b = 0;
    errno_t err;

    puts("请输入第一个文件名:");
    s_gets(file_app, LEN);
    puts("请输入第二个文件名:");
    s_gets(file_src, LEN);

    if ((err = fopen_s(&fp, file_app, "r")) != 0) {
        fprintf(stderr, "不能打开文件\n");
        exit(EXIT_FAILURE);
    }

    if ((err = fopen_s(&fs, file_src, "r")) != 0) {
        fprintf(stderr, "不能打开文件\n");
        exit(EXIT_FAILURE);
    }

    fseek(fp, 0L, SEEK_END); //将指针移到文件末尾
    fseek(fs, 0L, SEEK_END);
    i = ftell(fp); //计算文件字节数
    k = ftell(fs);
    rewind(fp);
    rewind(fs);

    while (a <= i && b <= k) {
        if ((a < i) && (count = getc(fp))) { //将第一个文件第一行输出
            printf("%c", count);
            a++;
        }

        if ((b < k) && ((count == '\n') || (feof(fp) == EOF))) { //输出第二个文件的第一行
            while (ch = getc(fs)) {
                printf("%c", ch);
                b++;
            }
        }
    }

    fclose(fp);
    fclose(fs);
}

这样修改后,程序将使用printf()函数进行输出,不再自动将光标移动到下一个位置。同时,注意在程序结束后关闭文件使用fclose()函数。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^