0

私の友人はクラスの1つにMATLABを使用する必要があるので、彼は私(コンピューターサイエンス専攻)に電話して、Cを教えてもらえないかと尋ねました。私はC ++に精通しているので、一般的な構文にも精通しています。しかし、CのIOライブラリを読み上げる必要がありました。

友達に見せるために簡単なIOプログラムをいくつか作成していましたが、3番目のプログラムが問題を引き起こしています。Eclipse(CDTを使用)を使用して自分のマシンでプログラムを実行すると、Eclipseのコンソールはグリッチな出力を生成し、データの入力を求める代わりに、入力を取得して、FAILUREで一度に出力します。

プログラムは、ユーザーからファイル名を取得し、ファイルを作成し、ユーザーが空白行を入力するまでファイルに書き込むことになっています。

コンソール(g ++ files2.c)を介して自分のマシンでコンパイル/実行すると、データの入力を正しく求められますが、FAILUREが表示され、出力ファイルがありません。

scanfを使用してファイル名を取得すると機能ファイルが作成されますが(おそらく空白を無視するため)、whileループに入らないため、エラーはchar配列の使用方法にあると思います。

#include <stdio.h>

#define name_length 20
#define line_size 80

int main() {
  FILE * write_file;                    // pointer to file you will write to
  char filename[name_length];           // variable to hold the name of file
  char string_buffer[line_size];        // buffer to hold your text

  printf("Filename: ");                 // prompt for filename

  fgets(filename, name_length, stdin);  // get filename from user

  if (filename[name_length-1] == '\n')  // if last char in stream is newline,
    {filename[name_length-1] = '\0';}   // remove it

  write_file = fopen(filename, "w");    // create/overwrite file user named

  if (!write_file) {printf("FAILURE");} // failed to create FILE *

  // inform user how to exit
  printf("To exit, enter a blank line (no spaces)\n");

  // while getting input, print to file
  while (fgets(string_buffer, line_size, stdin) != NULL) {
    fputs(string_buffer, write_file);
    if (string_buffer[0] == '\n') {break;}
  }

  fclose(write_file);
  return 0;
}

プログラムを修正するにはどうすればよいですか?ユーザーが終了した入力がファイルに書き込まれていることについては、ほとんど何も見つかりませんでした。

失礼しますが、大学のUNIXサーバーから削除するファイルがいくつかありますが、複雑なファイル名で作成されているため、名前で指定することはできません...

編集 - - -

私が言ったように、私は使用することができました

scanf("%s", filename);

有効なファイル名を取得します(改行文字なし)。ただし、whileループにscanfまたはfgetsを使用するかどうかに関係なく、ファイル名にscanfと組み合わせて使用​​すると、whileループに入らないため、ファイルに何も書き込むことができません。

ファイルへの書き込みとwhileループをどのように再構築する必要がありますか?

4

2 に答える 2

3

改行のチェックが間違っています。ファイル名の最後の文字を見ていますが、ユーザーが最大値より短いファイル名を入力すると、それより前になる可能性があります。次に、名前に改行が含まれるファイルを開こうとしています。

于 2012-10-02T16:56:03.217 に答える
1

これらの行は正しくないようです:

if (filename[name_length-1] == '\n')    // if last char in stream is newline,
    {filename[name_length-1] = '\0';}   // remove it

name_length - 1 文字を確認します。これは、導入されたファイル名の長さに関係なく、この場合は 19 です。したがって、ファイル名の長さが 18 未満の場合、文字列の末尾にある '\n' 文字は置き換えられません。明らかに、ファイル名に「\n」文字を含めることはできません。

例として strlen() を使用して、最初にファイル名のサイズを取得する必要があります。

if (filename[strlen(filename) - 1] == '\n')
{
    filename[strlen(filename) - 1] = '\0';
}

(string.h ヘッダーを含めることを忘れないでください)

私の弱い英語を手伝ってくれたことを願っています。

于 2012-10-02T17:06:51.913 に答える