Реализация fgetc; пытаясь прочитать слово за словом - PullRequest
1 голос
/ 15 января 2012

Я пытаюсь читать слово за словом, и ниже приводится логика, которую я принял. Это хорошо читается в словах, за исключением случаев, когда он достигает последнего слова в строке, в котором хранится последнее слово текущего файла И 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"

Ответы [ 5 ]

3 голосов
/ 15 января 2012

Посмотрите на это:

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

Если c == '\n', то c != ' ' равно также верно , что означает, что второй блок будет пропущен, а первый блок будет запущендля всех '\n' символов (т.е. они будут напечатаны).

Другие ответы об окончаниях строк неверны.C FILE * s, не открываемые в двоичном режиме, позаботятся о EOL для вас.Если у вас есть файл из DOS, и вы читаете его в Unix, это может создать проблемы, но я сомневаюсь, что это ваша проблема здесь, и если бы он обрабатывал его, он мог бы быть немного сложнее, чем показанные здесь ответы.Но вы можете пересечь этот мост, когда достигнете его.

1 голос
/ 15 января 2012

Кодировка символа завершения строки отличается от одной операционной системы к другой.В Linux это просто '\ n', в то время как в Windows и DOS это '\ r \ n'.Поэтому, в зависимости от вашей целевой ОС, вам может потребоваться изменить свое утверждение следующим образом:

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

РЕДАКТИРОВАТЬ: после тщательного изучения, я думаю, что вы делаете неправильночто первый оператор if верен, даже когда вы читаете \ n, поэтому вы должны обработать его следующим образом:

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

//this is where It should do nothing

}
else{
   //...
}
0 голосов
/ 15 января 2012

изменить if( c != ' ') на if( c != ' '&&c!='\n')

это должно решить проблему

0 голосов
/ 15 января 2012

Это работает для меня (в 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;
}
0 голосов
/ 15 января 2012

Попробуйте это;

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