2

ファイルから読み取るプログラムを作成し、さらに使用するために単語をリンクされたリストに保存する必要があります。fgetc を使用してテキストを 1 文字ずつ読み取り、 1 つの単語を示す改行 ( '\n') またはスペース ( ) が検出されるたびにすべてをリストに保存することにしました。' '申し訳ありませんが、私はファイルポインタの初心者です。これは私がこれまでに得たものです:

struct list { //global
char string[30];
struct list *next;
};


int main(void) {

    FILE *filePtr;
    char file[] = "text.txt";
    char tempStr[30];
    list *curr, *header;
    char c;
    int i = 0;
    curr = NULL;
    header = NULL;

    if((filePtr = fopen(file, "r")) == NULL) {
        printf("\nError opening file!");
        getchar();
        exit(101);
    }
    printf("\nFile is opened for reading.\n");

    while(!EOF) {
        while((c = fgetc(filePtr) != ' ') && (c = fgetc(filePtr) != '\n')) {
            curr = (list*)malloc(sizeof(list));
            //c = fgetc(filePtr);
            tempStr[i] = fgetc(filePtr);
            i++;
            }

        tempStr[i] = '\0';

        strcpy(curr->string, tempStr);
        curr->next = header;
        header = curr;

        i = 0;
    }

    while(curr!=NULL) {
        printf("%s - ", curr->string); //This will not print.
        curr = curr->next;
    }

    if(fclose(filePtr) ==  EOF) {
        printf("\nError closing file!");
        getchar();
        exit(102);
    }
    printf("\nFile is closed.\n");

    getchar();
    getchar();

}

テキスト ファイルの場合:

have a nice day

望ましい出力:

have - a - nice - day

しかし、開いたファイルと閉じたファイル以外は何も印刷できませんでした。

ありがとう。

4

5 に答える 5

1

マクロの値はEOF-1で定義されたシステム マクロstdio.hです。ファイル読み取り API ( fgetcfreadfscanf) は、ファイルの終わりに達すると -1 を返します。したがって、プログラムでは、常に0while(!EOF)であるため、これは常にfalseになります。は2の補数で表されるため、その変数のすべてのビットは1になります(サイズが2の場合、変数として格納されます)。NOT-1-1int-10xFFFFint

以下のサンプルコードを使用してください。

while(EOF != (c = fgetc(filePtr))) 
{

    if ((c == ' ') || (c == '\n'))
    {
        if (i == 0)
        {
            continue;
        }

        tempStr[i] = '\0';
        i = 0;

        //here do your linklist node creation and insertion operation

           continue;
    }

    tempStr[i] = c;
    i++;
}
于 2012-06-23T10:03:34.293 に答える
0

ネタバレ:

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

struct list {
    struct list *next;
    char string[30];
    };

int main(void) {

    FILE *fp;
    char file[] = "llist4.c";
     /* in C you CANNOT omit the "struct keyword" from a declaration or definition. */
    struct list *head=NULL, **pp= &head;
    int ch; /* getc() returns an int */
    size_t len ;
    char buff[30];

    fp = fopen(file, "r");
    if (!fp) {
        fprintf(stderr, "\nError opening file!");
        exit(EXIT_FAILURE);
    }
    printf("\nFile has been opened for reading.\n");

    for (len=0; len < sizeof buff;   ) {
        ch = fgetc(fp);
        if (ch == EOF && !len) break;
        if (ch == ' ' || ch ==  '\n' || ch == EOF) {
            if (!len) continue;
            buff[len] = '\0';
            *pp = malloc(sizeof **pp);
            if (!*pp) break;
            strcpy((*pp)->string, buff);
            (*pp)->next = NULL;
            pp = &(*pp)->next ;
            len=0; continue;
            }

        buff[len++] = ch;
    }

    if (len) {
        fprintf(stderr, "\nWord was too large, or out of memory\n");
        }

    for( ;head; head= head->next) {
        printf("%s - ", head->string);
    }

    if (fclose(fp) ==  EOF) {
        fprintf(stderr, "\nError closing file!\n");
        exit(EXIT_FAILURE);
    }
    printf("\nFile has been closed.\n");
exit(EXIT_SUCCESS);
}
于 2012-06-23T14:10:38.867 に答える
0

while 条件を、ファイルの読み取りに使用している関数に置き換える必要があります。 fgets はこれよりも恐ろしく効率的ではありませんか?

IE は、予想よりもはるかに大きなバッファーに文字列を読み取り、適切なサイズのバッファーにコピーして、それをノードにアタッチします。

于 2012-06-23T09:46:55.267 に答える
0
  • これは常に false です。

    while(!EOF)
    
  • メモリ割り当てコードを確認します。

    curr = (list*)malloc(sizeof(list))
    
  • ファイルの末尾に改行がない場合があります。

    while((c = fgetc(filePtr) != ' ') && (c = fgetc(filePtr) != '\n'))
    
于 2012-06-23T09:39:00.710 に答える
0
while(!EOF) {

これは常に false である一定の条件であるため、何も読み取ることはありません。

あなたのコードには、次のような他の問題もあります

curr = (list*)malloc(sizeof(list));

ループ内ですが、ループ外で curr を使用しています。

于 2012-06-23T09:39:39.243 に答える