在while循环中使用getc()时出现Valgrind错误

时间:2015-04-16 11:09:05

标签: c

我有一个作业,而我正在尝试从文件中打印字符。当我尝试使用while循环遍历文件时出现问题。好像我在while循环之外增加FILE ptr值然后使用getc()函数,没有出现错误,但是一旦我将它传递给循环,就会在第一轮迭代之后发生一些事情。任何人都可以解释,为什么会出现错误?

/* Prints the given file as text on the screen.
 * Only printable characters are shown. Non-printable characters are printed
 * as '?'. <filename> parameter is the name of the file.
 * 
 * Returns the number of characters read
 */

int textdump(const char *filename){

    FILE *textdump = fopen(filename, "r");
    if(!textdump) {
        return -1;
    }

    int getchar, eval, count = 0;
    /*The following few lines work, but as soon as I try to increase textdump inside the while loop, I get a valgrind error*/
    //getchar = getc(textdump);
    //textdump++;
    //getchar = getc(textdump); //this still doesn't give a Valgrind error..
    while ((getchar = getc(textdump)) != EOF) { //after first round the valgrind error appears?!
        eval = isprint(getchar);
        if (eval == 0){
            printf("?");
            textdump++;
            count++;
        }
        else 
            printf("%c", getchar);

            textdump++; //can this get out of bounds? shouldn't because end of file should appear before that...
            count++;

    }
    fclose(textdump);
    return count;
}

3 个答案:

答案 0 :(得分:1)

您正在递增文件指针,这将导致未定义的行为。

textdump++;

指针关节总是根据指针所指向的对象的大小来完成的,在这种情况下,递增文件指针不会达到预期的效果。

getc(fp)将确保文件指针前进到下一个字符。

答案 1 :(得分:1)

有些事情对我来说似乎很奇怪:

1:为什么要增加textdump? 检查:http://www.cplusplus.com/reference/cstdio/getc/

  

返回内部文件位置当前指向的字符   指定流的指示符。内部文件位置   然后指示器前进到下一个字符。

2:你的if/else看起来像我想的那样:

if (eval == 0)
    printf("?");
else 
    printf("%c", getchar);

或只是

if (isprint(getchar))
    printf("%c", getchar);
else 
    printf("?");

如果代码中eval == 0为真,则会有双倍增量。不是你正在寻找的确切问题,但无论如何都是一个问题

答案 2 :(得分:0)

textdump指针是类型FILE的库内部结构的指针,它反过来表示您打开的磁盘上的哪个文件,包含缓冲区管理信息等等。

以某种方式直接指向磁盘上的实际文件数据。 FILE结构实例对于整个交互是相同的,你真的不应该增加它。您从FILE获得fopen()指针,将其传递给需要处理该文件的所有函数,最后传递给fclose()。指针值始终完全相同。