2

strcmp()テキスト ファイルの特定の行が改行文字 ( ) と等しいかどうかをテストするために使用しようとしています\n。1 つのテキスト ファイルから各行を収集し、それらを別のテキスト ファイルに書き込んでいます。ソース ファイルの行全体が単なる 1 つの改行文字である場合、その行をターゲット ファイルに書き込みたくありません。

以下のコードはこの目的のために機能すると思いますが、そうではありません。しかし、条件の数値を 0 から 3 に変更すると、動作させたいように動作します。理由はありますか?

私の目標は、数値 0 を使用するように条件を変更することです。つまりstrcmp()、完全一致が見つかりますが、それを行うために条件の他の部分を変更する方法がわかりません。

#include <stdio.h>

void process_file(const char *inp_file, FILE *otp_fp) {

  char line[256];
  FILE *inp_fp = fopen(inp_file, "r");

  if (inp_fp != NULL) {
    while(fgets(line, 256, inp_fp) != NULL) {

      if (strcmp (line, "\n") != 0) { //changing to 3 gets desired result
        fprintf(otp_fp, line);
      }

    }
  }

  fclose(inp_fp);

}
4

2 に答える 2

1

あなたが説明する動作の唯一の説明は、行が実際には空ではないということです。それらの行には空白 (スペースやタブなど) が含まれている必要があります。そのような行を省略したい場合は、それらが本当に空白だけで構成されているかどうかを確認する必要があります。

fclose()(失敗した場合に NULL ポインターを使用しようとするコードの問題も修正しましfopen()た。これは、エラー条件が処理された後にのみコードを実行することによって、関数のインデント レベルを下げる方法も示しています。)

int str_is_whitespace(const char* line) {
    int onlyws = 1;
    int i = 0;
    while (onlyws && line[i] != '\0') {
        if (!isspace(line[i])) {
            onlyws = 0;
        }
        ++i;
    }
    return onlyws;
}

void process_file(const char *inp_file, FILE *otp_fp) {
    char line[256];
    FILE *inp_fp = fopen(inp_file, "r");
    if (inp_fp == NULL) {
        return;
    }
    while(fgets(line, 256, inp_fp) != NULL) {
        // Only output the text if it doesn't consist only of whitespace.
        if (!str_is_whitespace(line)) {
            fprintf(otp_fp, "%s", line);
        }
    }
    fclose(inp_fp);
}

<ctype.h>forを含める必要がありますisspace()

255 文字を超える行で問題が発生し、fgets()たまたま空白しかない行の残りの部分を読み取ってしまうことに注意してください。これに対処したい場合は、現在のテキストが実際に大きな行の一部であるかどうかを判断する追加のロジックが必要です。

于 2012-10-28T09:01:45.867 に答える
1
#include <stdio.h>
#include <string.h>

void process_file(const char *inp_file, FILE *otp_fp) {

  char line[256];
  FILE *inp_fp ;
  size_t len;

  inp_fp = fopen(inp_file, "r");

  if (!inp_fp ) return;

  while(fgets(line, 256, inp_fp) != NULL) {
    len = strlen(line);
        /* skip trailing space */
    while (len && (line[len-1] == '\n' || line[len-1] == '\r')) {line[--len] = 0;}

    if (!len ) continue;
        /* dont use random strings as format argument for printf() et.al.
        ** (there could be '%' signs in it) 
        ** Note: the \r\n (if any) were removed, and now are re-added.
        ** This will impose the line-ending convention that the current platform uses.
        */
    fprintf(otp_fp, "%s\n", line);

  }

  fclose(inp_fp);

}
于 2012-10-28T11:33:15.850 に答える