1

たぶんかなり単純な質問があります。次のファイルinput.txtがあります。

cat input.txt

testsuite1
test1
summary information of test
FAIL
testsuite2
test1
summary info ya
PASS

これらの各文字列を変数に読み込んでさらに処理するためだけのプログラムを書いています。それを行う最良の方法は何ですか?私は現在やっています:

main() {
    FILE *fp;
    char testsuite[100],testname[100],summary[100],result[100];
    fp = fopen("input.txt", "r");
    while(1) {
        if(fgets(testsuite,99,fp) == NULL)
        {
            ferror(fp);
            break;
        }
        if(fgets(testname,99,fp) == NULL)
        {
            ferror(fp);
            break;
        }
        if(fgets(summary,99,fp) == NULL)
        {
            ferror(fp);
            break;
        }
        if(fgets(result,99,fp) == NULL)
        {
            ferror(fp);
            break;
        }
        printf("testsuite: %s testname:%s summary:%s result:%s \n",testsuite,testname,summary,result);
    }


    fclose(fp);
}

それを行うより良い方法はありますか?私が現在直面している問題は、input.txt に空白行が 1 行でも含まれていると、空白のようなものが変数に読み込まれることです。それを避ける最善の方法は何ですか?

ありがとう!

4

3 に答える 3

2

空行をスキップする独自の関数を作成し (例: と呼ばれるgetline())、次の代わりに使用する必要がありますfgets()

char *getline(char *buf, int size, FILE *fp)
{
    char *result;
    do {
        result = fgets(buf, size, fp);
    } while( result != NULL && buf[0] == '\n' );
    return result;
}

その機能を改良して、空白のみまたは必要なもので構成される行をスキップすることもできます。

于 2014-06-11T15:03:03.600 に答える
0

これを行うと、各ループがバッファ内の各文字列を上書きするため、ループが終了すると読み取った文字列を使用できなくなります。ただし、文字列を構造体配列に格納できます。

    typedef struct {
    testsuite[100];
    testname[100];
    summary[100];
    result[100];
    }test;

    test test_array[2];

    int main(){
    int iIndex=0;
    FILE* fpPtr=NULL;
    fpPtr = fopen("input.txt", "r");
    if(fpPtr==NULL){  //<--- it is very important to check if fopen fails
       perror("fopen");
    }
    for(iIndex=0; iIndex<2; iIndex++){ // 2 because it is the number of elements in test_array
    if(fgets(test_array[i].testsuite,99,fp) == NULL)
     {
        ferror(fp);
        break;
     }
    if(fgets(test_array[i].testname,99,fp) == NULL)
     {
        ferror(fp);
        break;
     }
    if(fgets(test_array[i].summary,99,fp) == NULL)
     {
        ferror(fp);
        break;
     }
    if(fgets(test_array[i].result,99,fp) == NULL)
     {
        ferror(fp);
        break;
     }
    }

  }

fgets(cBuffer, sizeof(cBuffer), fpPtr); 位置 0 の改行文字をチェックすることで、空白行を検出できます。

//<-- if the file was created on windows, check for '\r' instead, since a new line in windows is \r\n
    if(cBuffer[0]=='\n')
    { 
      printf("blank line"\n);
    }
于 2014-06-11T15:07:16.067 に答える
0

ループ while の前に、ファイルのすべての空白行を削除できます。開いた後、ファイル全体を解析し、空白を削除します;)。しかし、それは最善の方法ではないようです。

各 fget の後に変数が空であるかどうかをチェックするのは賢明ではありません。この場合は、再度 fget を実行します。

それが役立つことを願っています。

于 2014-06-11T14:48:37.077 に答える