c - 将 fgetc 与 && 和 || 一起使用c中的运算符

标签 c

我正在编写合并两个文件的代码,这是代码:

void merge_files(){

FILE *ptf1,*ptf2,*ptf3;
char file_name1[50],file_name2[50],ch,file_name3[50];

int count=0;
printf("please enter the names of the files you want to merge:\n");
printf("file 1:\t");
fflush(stdin);
scanf("%[^\n]s",file_name1);
printf("file 2:\t");
fflush(stdin);
scanf("%[^\n]s",file_name2);
printf("enter the name of the file you want to merge in:\t");
fflush(stdin);
scanf("%[^\n]s",file_name3);
ptf1=fopen(file_name1,"r");
ptf2=fopen(file_name2,"r");
ptf3=fopen(file_name3,"w");
check(ptf1);
check(ptf2);
check(ptf3);
while(!feof(ptf1)&&!feof(ptf2))
{
    ch=0;
    while((ch=fgetc(ptf1))!='\n'&&(ch=fgetc(ptf1))!=EOF)
    {
        fputc(ch,ptf3);
    }
    fprintf(ptf3,"\n");
    while((ch=fgetc(ptf2))!='\n'&&(ch=fgetc(ptf2))!=EOF)
    {
        fputc(ch,ptf3);
    }
    fprintf(ptf3,"\n");
}
fclose(ptf1);
fclose(ptf2);
fclose(ptf3);}

它给了我一个垃圾输出,直到我意识到我应该像这样编写 while 循环条件:

while((ch=fgetc(ptf1))!='\n'&&ch!=EOF)

我的问题是写两次 fgetc 时会发生什么?它给 ch 两个值吗?我应该如何将 fgetc 与 & 运算符一起使用? 我也尝试使用相同的代码,但使用 ||运算符,并且当使用 fgetc 两次时,它似乎可以工作,即使它在每行的第一个字符处给了我垃圾输出,并且当使用 fgetc 一次它给了我一个无限循环时,我应该像使用 || 那样使用 fgetc 吗?运算符?:

while((ch=fgetc(ptf1))!='\n'||(ch=fgetc(ptf1))!=EOF)

就像 && 运算符一样?

while((ch=fgetc(ptf1))!='\n'&&ch!=EOF)

最佳答案

这些是编程中非常基本的逻辑操作。

while((ch=fgetc(ptf1))!='\n'&&ch!=EOF)

表示读取一个字符,如果该字符不是换行符也不是文件结束符则执行循环体。

while((ch=fgetc(ptf1))!='\n'||(ch=fgetc(ptf1))!=EOF)

表示读取一个字符,如果该字符不是换行符则执行循环体。否则,读取另一个字符,如果它不是文件结束字符,则执行循环体。

while((ch=fgetc(ptf1))!='\n'&&(ch=fgetc(ptf1))!=EOF)

表示读取一个字符,如果该字符不是换行符,则读取另一个字符,如果第二个字符不是文件结束符,则执行循环体。

关于c - 将 fgetc 与 && 和 || 一起使用c中的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50287908/

相关文章:

编译 -ansi -pedantic -Wall 自动切换 gcc

c - 给数组赋值需要memcpy

c - 如何通过 Asterisk 中的 AGI C 程序将传入调用路由到代理队列

c++ - 如何从 D DLL 返回 C 结构?

c - 根据规则排列对象所需的数据结构

c - 矩阵 int mat[5][5] 和 int ** 一样吗?

c - 基本文本编辑器 : passing a 1d string back to a 2d string array?

c - uint32_t 有 28 位而不是 32 位

C 当链表为空时删除链表的节点

c - 在 C 中读取命令行参数