0

したがって、ファイル内のテキストは次のようになります。

    locked y
    locked n
    position 90
    position 2
    audio-language "english"
    audio-language "spanish"

各テキスト ファイルには、上記の 1 種類の設定のみが含まれます。違いは、オプション (y または n、1 ~ 999、「英語」、「スペイン語」、「その他」) で、前に 4 つの空白があり、次の行に改行があります。各行の終わりなので、char配列文字列でパラメーターを抽出するfscanfが必要ですが、区切り文字を正しく使用する方法を理解できないようです。そのファイルをスキャンして、さまざまな設定と、それらがファイル内で見つかった回数を印刷できるプログラムを作成する必要があります。たとえば、次のようになります。

audio-language is found with setting: "spanish" 40 times

audio-language is found with setting: "english" 78 times

皆様、ご回答ありがとうございます!ここで、私がどのようにそれを機能させたかを示すことができます:

1 - 最初に、設定の前の空白を削除する関数 (インターネットで見つけたもの) を使用します。

char* ltrim(char* s) 
{
    char* newstart = s;

  while (isspace( *newstart)) {
    ++newstart;
   }

   // newstart points to first non-whitespace char (which might be '\0')
   memmove( s, newstart, strlen( newstart) + 1); // don't forget to move the '\0' terminator

return s;
 }

2 - 次に、fscanf は行を正しく取得するのに問題はありません。

while(!feof(fpoo)) {
    fscanf(fpoo,"%s %[^\n]",&first, &sec);

3 - 次に、fscanf が取得したものとユーザーが入力したものを比較します

それだけです。どうやらfscanfの全体的な問題は、すべての行の前にある空白が原因だったようです。

4

4 に答える 4

2

このコードをコンパイルしてテストしました。完璧に動作します。あなたもそれをテストすることができます:)

int main()
{
    int bytes_read = 0, english_count = 0, spanish_count = 0;
    char file_buffer[256], setting[127], option[32], fileName[32] = "FileName.txt";
    FILE *fp;
    if((fp = fopen("FileName.txt", "rb")) <=0)
    {
       printf("Unable to open the File\n");
    }
    //rewind(fp);
    while(fgets (file_buffer, 50, fp))
    {
       sscanf(file_buffer,"%s %s",setting,option);
       printf("Setting: ");
       printf("%s",setting);
       printf("\nOption: ");
       printf("%s",option);
       printf("\n\n");
       if(memcmp(setting,"audio-language",14) == 0)
       {
           if(memcmp(option,"english",7) == 0)
           {
               english_count = english_count+1;
           }
           if(memcmp(option,"spanish",7) == 0)
           {
               spanish_count = spanish_count+1;
           }
       }
           //you can add more checks here.
      }
    printf("\naudio-language is found with setting: english ");
    printf("%d",english_count);
    printf("\naudio-language is found with setting: spanish ");
    printf("%d",spanish_count);
    printf("\n");

return 0;
}
于 2013-07-26T09:16:46.273 に答える
1

最初に文字列を次のように読み取ることができます。

scanf("%[^\n]s",buffer)

C でトークナイザーを使用して、 strtokを使用して言語の値を取得できるようになりました。

char *token="\n";
token = strtok(line, token);

これで、トークンにはすべての分割単語が含まれます。これを可能な言語で strcmp と比較し、カウントを維持できます。

于 2013-07-26T08:44:21.833 に答える
0

あなたのコメントの人々は正しいです。あなたは本当に私たちにあなたの努力を示すべきでした. これが宿題である場合は、講師が簡単な Google 検索であなたをバストする可能性があるため、ごまかすことはできません。ここであなたの理解を推測して、あなたが既にカバーした内容をカバーすることを期待するのはもったいないので、あなたが何をしたかを見せてください。

qsortbsearchありstrcmp、文字列で始まるもの (例: 文字列プレフィックス付きの構造体) に対して、簡単で比較的効率的な並べ替えと検索のメカニズムを提供します。フォーマット文字列内の空白は、fscanfできるだけ多くの空白を消費するように指示します。fscanf成功と失敗のモードを示す値を返します。つまり、入力が特定の形式に一致するかどうかをテストするために、必ずしも各行を char の配列に読み込む必要はありません。ただし、どのコマンドも他のコマンドと共通のプレフィックスを持たないように、ファイルの設計に注意する必要があります。この場合、あなたは安全です。

これが私の試みです。ハッピーデバッグ:)

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

struct language_table { char language[64]; size_t count; };
struct language_table *parse(FILE *f, size_t *s);

int main(void) {
    size_t s;
    struct language_table *t = parse(stdin, &s);

    while (s-- > 0) {
        printf("audio-language is found with setting: %s %zu times\n", t[s].language, t[s].count);
    }

    free(t);
}

struct language_table *parse(FILE *f, size_t *s) {
    char locked, language[64];
    unsigned int position;

    int c = 0;

    struct language_table *table = NULL, *entry;
    size_t size = 0;

    do {
        if (fscanf(f, " locked %c", &locked) == 1 && strchr("ynYN", locked)) {
            /* XXX: Do something with locked. */
        }
        else if (fscanf(f, " position %u", &position) == 1) {
            /* XXX: Do something with position. */
        }
        else if (fscanf(f, " audio-language %63s", language) == 1) {
            /* search for the language in table. */
            entry = bsearch(language, table, size, sizeof *table, strcmp);

            /* insert the language if it's not found. */
            if (entry == NULL) {
                if ((size & (size + 1)) == 0) {
                    void *new = realloc(table, (size * 2 + 1) * sizeof *table);
                    if (new == NULL) {
                        fprintf(stderr, "failed to allocate new entry for %s\n", language);
                        free(table);
                        return NULL;
                    }
                    table = new;
                }

                entry = table + size++;
                strcpy(entry->language, language);
                entry->count = 0;

                /* sort & search */
                qsort(table, size, sizeof *table, strcmp);
                entry = bsearch(language, table, size, sizeof *table, strcmp);
            }

            entry->count++;
        }
        else {
            /* consume an invalid line */
            do {
                c = fgetc(f);
            } while (c >= 0 && c != '\n');
        }
    } while (c >= 0);

    *s = size;
    return table;
}
于 2013-07-27T01:39:28.033 に答える
0

アルゴリズムを確認し、コーディングする必要があります

  1. ファイルを 1 行ずつ、たとえば一度に 1024 バイトずつ読み取ります。
  2. 次に、必要な行をスキャンします。たとえば、音声言語「英語」または音声言語「スペイン語」の場合です。
  3. 言語タイプの文字列を取得する
  4. 次に、この行を何回見つけたか数えます。

これで問題は解決すると思います。

于 2013-07-26T08:21:23.433 に答える