实现fgetc;试图逐字阅读

时间:2012-01-14 21:47:50

标签: c fgetc

我试图逐字阅读,下面是我采用的逻辑。这是正确的读取,除非它到达一行中的最后一个单词,其中它存储当前文件的最后一个单词和下一个新行的第一个单词。有人可以告诉我如何才能让它发挥作用吗?

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 个答案:

答案 0 :(得分:3)

看看这个:

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

如果c == '\n',则c != ' ' 也为真,这意味着将跳过第二个块,并且第一个块将针对所有'\n'个字符运行,(即将打印出来)。

关于行结尾的其他答案是错误的。未以二进制模式打开的C FILE *将为您处理EOL。如果你有一个来自DOS的文件并且你在Unix上阅读它可能会产生问题,但我怀疑这是你的问题,如果它正在处理它可能比这里显示的答案稍微复杂一点。但是当你到达那座桥时,你可以越过那座桥。

答案 1 :(得分:1)

行终止字符的编码因操作系统而异。在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{
   //...
}

答案 2 :(得分:0)

试试这个;

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

答案 3 :(得分: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;
}

答案 4 :(得分:0)

变化 if( c != ' ')if( c != ' '&&c!='\n')

这应解决问题