-1

これは同じのコードです。私が直面している問題は、どのファイルにも何も書き込めないことです。これを解決するのを手伝ってください

#include <stdio.h>
#include <string.h>

int main()

{
  FILE *fe;
  FILE *fo;
  FILE *fg;
  int i;
  int j,l;
  char ch;
  char tmp[100] ;

 fo = fopen("oddfile.txt","a");
 if (fo == NULL)
 {
  perror("ODDFILE");
 }
 fclose(fo);

 fe = fopen("evenfile.txt","a");
 if (fe == NULL)
 {
  perror("EVENFILE");
 }
 fclose(fe);

 fg = fopen("generalfile","r");
 if (fg == NULL)
 {
  perror("GENERALFILE");
 }

 while(ch = fgetc(fg)!=EOF)
 {
    if (ch != '\n' && ch != 't' && ch != ' ')
    {
        tmp[i] = ch;
        i++;
    }


    else 
    {
        printf("%s",tmp);
        l =strlen(tmp);
        j = l % 2;
        if (j == 0)
        {
          fe = fopen("evenfile.txt","ab");
            if (fe == NULL)
            {
                perror("EVENFILE");
             }  

         fwrite(&tmp,sizeof(tmp),1,fe);
         fclose(fe);

        }

        else
        {
            fo = fopen("oddfile.txt","ab");
            if (fo == NULL)
             {
                perror("ODDFILE");
             }
         fwrite(&tmp,sizeof(tmp),1,fo);
         fclose(fo);

        }
    }

 }

}   

私のコードは正常にコンパイルされていますが、目的の出力を得ることができません

4

1 に答える 1

1

変化する:

 while(ch = fgetc(fg)!=EOF)

 while( (ch = fgetc(fg)) !=EOF)

優先順位規則により、2 つの動作は異なります。コーディング方法chは常に 0 または 1 に設定され、どちらも印刷可能な文字ではありません。

ファイルを複数回開く理由はありません。ループの前に各出力ファイルを 1 回開くだけです。fprintfではなくを使用するのが賢明であり、長さとして のfwriteサイズを使用しないでください。tmpすでに文字列の長さを計算しているので、それを使用してください! また、各単語の後に改行または区切り文字を書きたいと思うかもしれません。また、スタック オーバーフローをチェックし、入力に大きな単語が含まれている場合はそれを処理する必要があります。入力した単語が 100 文字の配列に収まるとやみくもに想定するのは、大変な事態が待っています。strlen入力の最後にヌル文字を置き忘れて、文字列ではない可能性のある文字配列を呼び出すよりも少し悪いです。tmp(これは別のバグです。入力の最後にNULL を書き込む必要があります。)

また、次のようなエラー メッセージが表示されるのは非常に煩わしいことにも注意してください。

ODDFILE: no such file or directory

プログラムが実際に気にかけているファイルが「ODDFILE」と呼ばれていない場合。

そして最後に (この短いプログラムにさらに多くのバグがある可能性は十分にあります)、1983 年以降の標準的な慣行に準拠するためだけにコンパイラに存在する動作に依存するのをやめることは素晴らしい考えです。 main 関数を宣言します。として適切にint main( void )、または(さらに良い)を使用int main( int argc, char **argv)して、呼び出し元が入力ファイル名を指定できるようにします。そして、main から値を返します! 有益な情報を提供してくれるので、コンパイラの警告も上げてください。

于 2013-09-29T11:37:18.603 に答える