我需要从2个不同的文件中读取并将单词打印到第三个单词,首先我从file1中读取并将第一个单词保存到文件中第三个,然后从file2中读取并将第一个单词从此处保存到第二个单词中作为第二个单词,依此类推..以及file1中的单词在单词开头都带有“ +”,file2中的单词带有“-”。我的问题是代码不会停止并且仍在工作,并且可以将其打印到第三个文件“。”(许多点)。谢谢
#include<stdio.h>
#include<stdlib.h>
int main(){
FILE *first, *second, *third;
char ch[256],ch1[256],ch2;
int i=1,count;
char space = ' ';
char minus = '-';
char plus = '+';
first=fopen("prvy.txt", "r");
second=fopen("druhy.txt", "r");
third=fopen("treti.txt", "w");
if(first==NULL || second==NULL || third==NULL)
{
printf("error");
exit(1);
}
while (fscanf(first, "%255s", ch) == 1)
{
count++;
}
while (fscanf(second, "%255s", ch) == 1)
{
count++;
}
printf("%d",count);
for(i;i<=count;i++)
{
if(i%2==1)
{
fputc(plus,third);
ch2=fgetc(first);
while(ch2 != EOF || ch2 != ' ')
putc(ch2,third);
ch2=fgetc(first);
}
else if(i%2==0)
{
fputc(minus,third);
ch2=fgetc(second);
while(ch2 != EOF || ch2 != ' ')
putc(ch2,third);
ch2=fgetc(second);
}
fputc(space,third);
}
fclose(first);
fclose(second);
fclose(third);
return 0;
}
答案 0 :(得分:2)
在这里看看两个while
循环:
if(i%2==1)
{
fputc(plus,third);
ch2=fgetc(first);
while(ch2 != EOF || ch2 != ' ')
putc(ch2,third);
ch2=fgetc(first);
}
else if(i%2==0)
{
fputc(minus,third);
ch2=fgetc(second);
while(ch2 != EOF || ch2 != ' ')
putc(ch2,third);
ch2=fgetc(second);
}
第一个问题是ch2 != EOF || ch2 != ' '
将始终为真。如果ch2
为EOF,则第一个条件为false,但第二个条件为true。如果ch2
是空格,则第二个条件为false,第一个条件为true。如果两者都不是,则都为真。
您要检查ch
是否都是不是EOF 并且不是空格:
while(ch2 != EOF && ch2 != ' ')
如果不是这样,此将会起作用:
char ch[256],ch1[256],ch2;
您已将ch2
定义为char
,而fgetc
返回了int
。值EOF
超出了char
的范围,因此您永远不会看到该值。将其更改为int
:
char ch[256],ch1[256]
int ch2;
您的while
循环也没有括号。因此,您实际拥有的是:
while(ch2 != EOF || ch2 != ' ') {
putc(ch2,third);
}
ch2=fgetc(first);
ch2
永远不会在循环内部更改,因此您有一个无限循环。将括号放在它们所属的位置:
if(i%2==1)
{
fputc(plus,third);
ch2=fgetc(first);
while(ch2 != EOF && ch2 != ' ') {
putc(ch2,third);
ch2=fgetc(first);
}
}
else if(i%2==0)
{
fputc(minus,third);
ch2=fgetc(second);
while(ch2 != EOF && ch2 != ' ') {
putc(ch2,third);
ch2=fgetc(second);
}
}
最重要的是,在进入first
循环之前,second
和for
的文件指针都在每个文件的末尾,所以没有什么可读取的。>
进入此循环之前,您需要调用rewind(first)
和rewind(second)
。
最后,count
未初始化。它可能包含一些随机的大数字,因此您的循环可能比您预期的运行更多次。
请务必将其设置为0:
int i=1,count=0;