gpt4 book ai didi

c - 额外的 EOF 字符

转载 作者:太空宇宙 更新时间:2023-11-04 06:01:27 25 4
gpt4 key购买 nike

我有一个将文件读入缓冲区结构的程序。我遇到的问题是,当我查看文件的输出时,末尾有一个额外的 EOF 字符。我会发布相关功能:(注意:我删除了参数检查,只发布了与该问题相关的功能中的代码)

b_load

int b_load(FILE * const fi, Buffer * const pBD){
unsigned char character; /*Variable to hold read character from file*/
Buffer * tempBuffer; /*Temparary Bufer * to prevent descruction of main Buffer*/
short num_chars = 0; /*Counter of the amount of characters read into the buffer*/

/*Assigns main Buffer to tempBuffer*/
tempBuffer = pBD;

/*Infinite loop that breaks after EOF is read*/
while(1){
/*calls fgetc() and returns the char into the character variable*/
character = (unsigned char)fgetc(fi);

if(!feof(fi)){
tempBuffer = b_addc(pBD,character);

if(tempBuffer == NULL)
return LOAD_FAIL;
++num_chars;
}else{
break;
}
}
return num_chars;
}

b_打印

int b_print(Buffer * const pBD){
int num_chars = 0;

if(pBD->addc_offset == 0)
printf("The buffer is empty\n");
/*Sets getc_offset to 0*/
b_set_getc_offset(pBD, 0);

pBD->eob=0;

/*b_eob returns the structures eob field*/
while (!b_eob(pBD)){
printf("%c",b_getc(pBD));
++num_chars;
}
printf("\n");

return num_chars;
}

b_getc

char b_getc(Buffer * const pBD){
if(pBD->getc_offset == pBD->addc_offset){
pBD->eob = 1;
return R_FAIL_1;
}
pBD->eob = 0;
return pBD->ca_head[(pBD->getc_offset)++];
}

最后我得到了:

“一只猫ÿ”(y 是 EOF 字符)

它打印一个 EOF 字符,但从未添加到缓冲区。当驱动程序代码将 EOF 字符添加到缓冲区的末尾时,将出现 2。知道是什么原因造成的吗?我可能用错了 feof() 所以可能是这样,但它在代码中是必需的

最佳答案

没有“EOF 字符”。 EOF 是由getchar() 和相关函数返回的值,表示它们没有更多的输入可读取。它是一个扩展为负整数常量表达式的宏,通常是 (-1)

(对于 Windows 文本文件,文件结束条件可能由文件中的 Control-Z 字符触发。如果您以文本模式阅读此类文件,您将不会看到那个字符;它会表现得就像它到达文件末尾一样。)

不要使用 feof() 函数来检测没有更多的输入可读。相反,请查看您正在使用的任何输入函数返回的值。不同的输入函数使用不同的方式来表明它们无法读取任何内容;阅读您正在使用的文档。例如,fgets()返回空指针,getchar()返回EOFscanf()返回它能够读取的项目数。

getchar(),例如,返回 either 它刚刚读取的字符(被视为 unsigned char 并转换为 int) EOF 表示它无法读取任何内容。 EOF 的负值是专门选择的,以避免与 unsigned char 类型的任何有效值发生冲突。这意味着您需要将 getchar() 返回的值存储在一个 int 对象中;如果将其存储在 charunsigned char 中,则可能会丢失信息,并且值为 0xff 的实际字符可能会被误认为EOF.

feof() 函数返回您正在读取的文件的文件结束指示符的值。该指示符在您尝试读取文件但失败后变为真。如果您因为错误而不是文件结束条件而用完输入,feof()永远变为真。

您可以使用 feof() 和/或 ferror() 来确定为什么没有更多的输入可读,但只有在您通过其他方式。

推荐阅读:comp.lang.c FAQ 的第 12 节,其中包括标准输入输出。 (以及其余部分。)

更新:

我还没有看到足够多的代码来理解您对 Buffer 对象所做的事情。您的输入看起来实际上(几乎)是正确的,尽管它以笨拙的方式编写。

从文件中读取字符的常用习惯用法是:

int c;   /* `int`, NOT `char` or `unsigned char` */
while ((c = fgetc(fi)) != EOF) {
/* process character in `c` */
}

但是你的方法,我可能会这样重新安排:

while (1) {
c = fgetc(fi);
if (feof(fi) || ferror(fi)) {
/* no more input */
break;
}
/* process character in c */
}

应该确实有效。请注意,我添加了对 ferror(f1) 的检查。可能是您输入错误(您没有检测到)?这将导致 c 包含 EOF,或者 EOF 的值转换为 c 的类型。不过,这是值得怀疑的,因为它可能会给您带来无限循环。

建议的方法:使用交互式调试器或添加 printf 调用,在每次循环中显示 character 的值。如果您的输入循环工作正常,则使用对 b_addc() 的硬连线调用序列构建程序的精简版本,并查看是否可以通过这种方式重现问题。

关于c - 额外的 EOF 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19012886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com