問題

2017-11-26 4 views
-1

を書いて、私はファイルへの書き込みの問題を持っている、これはコードです:問題

#include <stdio.h> 

int main(int argc,char* argv[]) 
{ 
    if(argc!=2) 
    { 
     printf("\x1B[31mError::%s takes exactly one argument!\n\x1B[0m",argv[0]); 
     return 1; 
    } 

    char string[100]; 

    FILE* file=fopen(argv[1],"w"); 
    if(file==NULL) 
    { 
     printf("\x1B[31mFile is invalid!\x1B[0m\n"); 
     return 1; 
    } 

    while(!feof(stdin)) 
    { 
     scanf("%s",string); 
     fprintf(file,"%s\n",string); 
    } 
    fclose(file); 
    return 0; 
} 

私は、ファイルの文字(CTRL + Zの終わりを入力するまで、それはscanf関数での入力を取得し、ファイルに書き込む必要があります)、実行が終了すると、開いたファイルは空です。このコード構造もデテルの中で提案されています&デイテルの本「ここに何が間違っているのですか? また、私はscanf( "%[^ \ n]"、文字列)を実行すると、たぶん1単語の代わりにscanfで全体のフレーズを取ることができることを知りたいです プログラムは混乱してしまいます。私が何かを書くと、同じことを繰り返し書くループに入り、ファイルは17Gbのようになります。

+0

while(!feof(fp))の使用は常に間違っています。 –

+0

ctrl + Zは強制的にプロセスの実行を停止するSIGTSTPであり、データはファイルに保存されません。 – achal

+0

eofキーがOSに基づいていないことが判明しました。これはCtrl + Dではなく、 ですが、なぜscanf( "%[^ \ n]"、文字列)が機能しないのか知りたいですか? –

答えて

0

ユーザーが内部signal20を受信しないと、あなたのプロセスはstoppedになりますが、プログラムがabnormallyを終了してしまったので、データが保存されnotます(a.outctrl+zあなたのプロセスを押します。

terminalman 7 signalと入力してdefault actio nをctrl+zにチェックすることができます。では、デフォルト動作でctrl+zを変更する必要がありますか?どうやって ? signal()またはsigaction()を使用してください。

ctrl+zを押すたびに、isr()にジャンプし、saveexit()システムコールを使用して現在のプロセスステータスにジャンプします。 ctrl+zは信号no 20です。

私はあなたのコードに小さな変更を加えました。

#include <unistd.h> 
#include <stdio.h> 
#include <signal.h> 
void isr(int n) 
{ 
     if(n == 20)//if ctrl+z is pressed then condition will be true 
     { 
       printf("in isr :\n"); 
       exit(0);//exit(0) is normal termination of process i.e it will save current process context 
     } 
} 
int main(int argc,char* argv[]) 
{ 
     if(argc!=2) 
     { 
       printf("\x1B[31mError::%s takes exactly one argument!\n\x1B[0m",argv[0]); 
       return 1; 
     } 

     char string[100]; 

     FILE* file=fopen(argv[1],"w"); 
     if(file==NULL) 
     { 
       printf("\x1B[31mFile is invalid!\x1B[0m\n"); 
       return 1; 
     } 

     while(!feof(stdin)) 
     { 
       signal(20,isr);//when user presses ctrl+z it will jump to isr() 
       scanf("%s",string); 
       fprintf(file,"%s\n",string); 

     } 

     fclose(file); 
     return 0; 
} 

は一度signal()exit()のmanページを経ます。