1

私は単語ごとに読もうとしていますが、以下は私が採用したロジックです。これは、現在のファイルの最後の単語と次の新しい行の最初の単語を格納する行の最後の単語に到達する場合を除いて、単語をうまく読み取ります。誰かがこれを機能させる方法を教えてもらえますか?

int c;
int i =0;
char line[1000]
do{
    c = fgetc(fp);

    if( c != ' '){
        printf("%c", c);
    line[i++] = c;

    }else if((c == '\n')){

//this is where It should do nothing

    }else{
    line[i] = '\0';
    printf("\\0 reached\n");//meaning end of one word has been reached
    strcpy(wordArr[counter++].word, line);//copy that word that's in line[xxx] to the struct's .word Char array
    i=0;//reset the line's counter

    }//if loop end



} while(c != EOF);//do-while end

fpファイルポインタです。

HI BABY TYPE MAYBE
TODAY HELLO CAR
HELLO ZEBRA LION DON
TYPE BABY

私は得ています(引用符なし)

"HI"
"BABY"
"TYPE" 
"MAYBE
TODAY"
4

5 に答える 5

3

これを見てください:

if(c != ' ') {
    // ...
} else if(c == '\n') {
    // WILL NEVER BE REACHED
}

true の場合c == '\n'、2 番目のブロックはスキップされ、最初のブロックはすべての文字に対して実行されます (つまり、印刷されます)。c != ' ''\n'

行末に関する他の回答は間違っています。バイナリ モードで開かれていないCFILE *は、EOL を処理します。DOS からファイルを取得し、Unix で読み取ると問題が発生する可能性がありますが、それがここでの問題であるとは思えません。しかし、その橋にたどり着いたら、あなたはその橋を渡ることができます。

于 2012-01-14T22:07:07.160 に答える
1

行末文字のエンコードは、オペレーティング システムによって異なります。Linux では単に '\n' ですが、Windows と DOS では '\r\n' です。したがって、ターゲット OS によっては、ステートメントを次のように変更する必要がある場合があります。

if((c == '\r' || (c == '\n'))
{
   //...
}

編集:よく見てみると、あなたが間違っているのは、\n を読んでも最初のifステートメントが true であるため、次のように処理する必要があると思います:

if((c != ' ') && (c != '\n')){
    printf("%c", c);
    line[i++] = c;
}
else if((c == '\n') || (c == '\r')){

//this is where It should do nothing

}
else{
   //...
}
于 2012-01-14T22:00:48.197 に答える
0

これを試して;

 if((c == '\n') || (c == '\r'){ 
于 2012-01-14T21:54:23.960 に答える
0

これは私にとってはうまくいきます(Linux上):

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

int
main(int argc, char **argv)
{
        char c;
        size_t i = 0;
        FILE *file = NULL;
        char buffer[BUFSIZ];
        int status = EXIT_SUCCESS;
        if (argc < 2) {
                fprintf(stderr, "%s <FILE>\n", argv[0]);
                goto error;
        }
        file = fopen(argv[1], "r");
        if (!file) {
                fprintf(stderr, "%s: %s: %s\n", argv[0], argv[1],
                                strerror(errno));
                goto error;
        }
        while (EOF != (c = fgetc(file))) {
                if (BUFSIZ == i) {
                        fprintf(stderr, "%s: D'oh! Write a program that "
                                        "doesn't use static buffers\n",
                                        argv[0]);
                        goto error;
                }
                if (' ' == c || '\n' == c) {
                        buffer[i++] = '\0';
                        fprintf(stdout, "%s\n", buffer);
                        i = 0;
                } else if ('\r' == c) {
                        /* ignore */
                } else {
                        buffer[i++] = c;
                }
        }
exit:
        if (file) {
                fclose(file);
        }
        return status;
error:
        status = EXIT_FAILURE;
        goto exit;
}
于 2012-01-14T22:09:47.150 に答える
0

if( c != ' ') に 変更 if( c != ' '&&c!='\n')

これで問題は解決するはずです

于 2012-01-14T22:16:36.463 に答える