10

プログラムを実行しようとすると、間違った行数が出力されます。

LINES: 0

.txtファイルに5行ありますが、これは出力です。

これが私のプログラムです:

#include<stdio.h>
#include<stdlib.h>

int countlines(char *filename);

void main(int argc, char *argv[])
{
  printf("LINES: %d\n",countlines(argv[1]));         
}


int countlines(char *filename)
{
  // count the number of lines in the file called filename                                    
  FILE *fp = fopen(filename,"r");
  int ch=0;
  int lines=0;

  if (fp == NULL);
  return 0;

  lines++;
  while ((ch = fgetc(fp)) != EOF)
    {
      if (ch == '\n')
    lines++;
    }
  fclose(fp);
  return lines;
}

単純な間違いだと思いますが、プログラミングは初めてです。どんな助けでも大歓迎です。

4

8 に答える 8

29
while(!feof(fp))
{
  ch = fgetc(fp);
  if(ch == '\n')
  {
    lines++;
  }
}

ただし、注意してください: 「while ( !feof (file) )」が常に間違っているのはなぜですか? .

于 2012-10-04T18:37:19.270 に答える
4

あなたが持っている ; の最後にif。変化する:

  if (fp == NULL);
  return 0;

  if (fp == NULL) 
    return 0;
于 2012-10-04T18:53:57.407 に答える
4

あなたは宣言します

int countlines(char *filename)

char *議論をする。

あなたはそれをこのように呼びます

countlines(fp)

FILE * を渡します。

そのため、そのコンパイル エラーが発生します。

おそらくその2行目を次のように変更する必要があります

countlines("Test.txt")

カウントラインでファイルを開くので

現在のコードは、2 つの異なる場所でファイルを開こうとしています。

于 2012-10-04T18:05:46.380 に答える
3

ファイルを開き、ファイル名のみを必要とする関数にファイル ポインターを渡して、ファイル自体を開きます。への呼び出しを簡素化できます。

void main(void)
{
  printf("LINES: %d\n",countlines("Test.txt"));
}

編集:質問を変更しているため、答えるのが非常に困難です。最初に変更をmain()間違ってしまい、最初のパラメーターが argc であることを忘れたため、クラッシュしました。今、あなたは次の問題を抱えています。

if (fp == NULL);   // <-- note the extra semicolon that is the only thing 
                   //     that runs conditionally on the if 
  return 0;        // Always runs and returns 0

これは常に 0 を返します。余分なセミコロンを削除すると、適切なカウントが得られるはずです。

于 2012-10-04T18:06:28.770 に答える
0

セグメンテーション違反の原因について、すぐに明らかなことは何もわかりません。私の唯一の疑惑は、あなたのコードは、実行時にファイル名をパラメータとして取得することを期待しているということですが、それを渡さないと、とにかくファイル名を参照しようとします。

argv[1]存在しないときにアクセスすると、セグメンテーション違反が発生します。一般に、引数を参照する前に引数の数を確認することをお勧めします。これを行うには、 の次の関数プロトタイプを使用し、が 1 より大きいmain()ことを確認します (単純に、argv のエントリ数を示します)。argc

int main(int argc, char** argv)

一般的にセグメンテーション違反の原因を突き止める最良の方法は、デバッガーを使用することです。Visual Studio を使用している場合は、メイン関数の先頭にブレークポイントを配置し、プログラムの開始時に [デバッグなしで実行] ではなく [デバッグ付きで実行] を選択します。先頭で実行が停止し、問題が発生するまで 1 行ずつ実行できます。

Linux を使用している場合は、コア ファイル (名前に「core」が含まれます) を取得し、gdb(GNU Debugger) でロードするだけです。これにより、セグメンテーション違反の原因となった行を直接指摘するスタック ダンプが得られます。

編集:質問とコードを変更したようです。したがって、この回答はおそらくもう役に立たないでしょうが、とにかく良いアドバイスなのでそのままにしておき、変更された質問にすぐに対処できるかどうかを確認します)。

于 2012-10-04T18:46:47.737 に答える