1

ここに初めて投稿します。私はこれを行う他の人々の方法をいくつか見てきましたが、その方法の 1 つは、私がやろうとしている方法とほぼ同じ方法でした。しかし、それは私にはうまくいきませんか?

#include<stdio.h>
int main()
{

FILE *file;
char buffer[15];
char *text[12];

file = fopen("Text.txt", "r");

if(!file) {
    printf("Failed");
    return 1;
}


int count = 0;
while(fgets(buffer,sizeof buffer, file) != NULL) {
    printf("%s", buffer);
    text[count] = buffer;
    count++;
}   
printf("\n");
for (count=0;count<10;count++) {
    printf("%s\n", text[count]);
}

fclose(file);

return 0;

}

現在、別のサイトで(解決策またはヘルプを探しているときに、これを見つけましたhttp://www.daniweb.com/software-development/c/threads/316766/storing-string-in-a-array-reading-from-text -ファイル

その人が私と同じようにそれを行った場合(彼らが読んでいるものなどの明らかにわずかな違いは別として)。

私のテキスト ファイルには次のように書かれています。

基本的に、ファイルを 1 行ずつ読み取り、各行を配列の次のスペースに保存したいと考えています。

行を使用するコードで printf("%s", buffer); 各行の各単語をコンソール ウィンドウに出力します。ただし、for ループを使用して配列の内容を出力すると、配列内の各スペースに対して単に「犬、犬、犬...」と出力されます。

誰かがここで私を助けることができますか? 私はそれを間違っていますか?

4

3 に答える 3

1

buffer常に同じアドレスであるため、配列のすべての要素にtextは同じポインターが含まれています (または初期化されていません)。

考慮する必要があります(POSIXシステムを想定):

  • たとえば、すべての配列をゼロにして初期化します(また、へのすべてのポインタを初期化しますNULLmemset(buffer, 0, sizeof(buffer));(ラインバッファの場合は、ループの最後にもクリアします)。

  • strdup読み取り文字列をieコードで複製する

    text[count] = strdup(buffer);
    

    必要に応じてそれを忘れないでくださいfree。実際には、ポインターstrdupを返すことによって失敗していないことを確認する必要があります。NULL

  • getlineを使用して行を読み取ります (ポインターを初期化し、NULL最終的にはポインターを初期化することを忘れないでくださいfree)。

  • 特に入力の前​​に、printf書式設定文字列を改行\nまたは else callで終了します。fflush

  • エラー コードerrnoを使用して、より適切なエラー メッセージを表示します。または、次のように呼び出しperrorます

    file = fopen("Text.txt", "r");
    if (!file) {
      perror("fopen Text.txt failed");
      exit (EXIT_FAILURE);
    }
    

すべての警告とデバッグ情報 ( gcc -Wall -gLinux など) を使用してコンパイルする習慣を身につけ、デバッガーの使用方法 (たとえば ) を学びますgdb。特に、プログラムを 1 行ずつ実行してみてください。

厳密な (非 POSIX) しかし単純な C2011 標準のコーディングに興味があるかもしれません。しかし、そうすると、多くの POSIX 関数 ( strdupetc... など) を自由に使用できなくなります。私は Posix と Linux のファンであり、Posix 以外のシステムは気にしないので、C99 に厳密に準拠するためのコードを書くという退屈な作業は読者に任せます (C99 はディレクトリについても認識しておらず、ほぼ「フラットな」ファイルシステムを想定していることを思い出してください)。 (特に、1990 年以降は Windows や Microsoft システムを使用していません)。

また、いくつかのフリー ソフトウェア プロジェクトのコードを読んでみてください (たとえば、freecodeから)。あなたは多くを学ぶでしょう

于 2013-01-26T11:02:57.187 に答える
1

にメモリが割り当てられていませんtext。そしてbuffer、各反復で変化する値をコピーする必要があります。何かのようなもの:

while(fgets(buffer,sizeof buffer, file) != NULL) {
    printf("%s", buffer);
    text[count] = malloc(strlen(buffer) + 1);
    strcpy(text[count], buffer);
    count++;
}   

また、割り当て失敗の malloc の戻り値を確認してください。

于 2013-01-26T11:03:11.627 に答える
0

コードには 2 つの問題があります。

  1. while ループでは、同じポインター ( buffer) をポインターの配列に何度も格納し、バッファーの内容も上書きしています。おそらく、各読み取り文字列の長さだけバッファーポインターを進める必要があります。

  2. for ループでは、実際の行数を破棄し、初期化されていないポインターを逆参照する可能性があります。そうしないでください。

于 2013-01-26T11:05:35.263 に答える