2つの異なるファイルから読み取り、単語を3番目のファイルに出力する必要があります。最初にfile1から読み取り、最初の単語を3番目のファイルに保存し、次にfile2から読み取り、最初の単語をここから3番目のファイルに2番目の単語として保存します。また、file1の単語には単語の先頭に「+」があり、file2の単語には「-」があります。私の問題は、コードが停止せず、まだ機能していて、3番目のファイル "。"(多くのドット)に出力されることです。ありがとう
#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;
}
while
ここで2つのループを見てください:
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ですが、2番目は本当です。場合はch2
スペースである、第2の条件は偽となり、最初は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;
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加