我有一个作业,而我正在尝试从文件中打印字符。当我尝试使用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;
}
答案 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()
。指针值始终完全相同。