getc(fp):奇怪的字符:ÿ(在最底部)

时间:2017-06-22 05:36:08

标签: c

一个新的空文件:

touch /file.txt

读取。打印。

fp = fopen("/file.txt", "r");
char text[1000];
int i=0;

while(!feof(fp)){
text[i++] = getc(fp);
}

text[i]='\0';

printf("%s\n", text);

结果:

ÿ

EXTRA INFO :如果file.txt有很多行..它会在它的最底部附加那个奇怪的字符。所以也许并不是每个“while循环”都会发生的事情。

2 个答案:

答案 0 :(得分:6)

如果您使用的是ISO 8859-15或8859-1代码集,则ÿ(带有DIAERESIS的LATIN SMALL LETTER,Unicode中的U + 00FF)代码为255 10 或0xFF。将EOF存储在数组中时,它将转换为ÿ。

不要将EOF存储在char中。请记住,getchar()会返回int,而不是char。它必须能够返回可以存储在unsigned char中的每个值,加上EOF是负数(通常但不一定是-1)。

并且,如评论中所述,while (!feof(file)) is always wrong。这只是另一个原因。

此代码或多或少是固定的。如果无法打开文件,它应该报告错误。请注意,它还可以确保您不会溢出缓冲区。

FILE *fp = fopen("/file.txt", "r");
if (fp != 0)
{
    char text[1000];
    int i=0;
    int c;
    while ((c = getc(fp)) != EOF && i < sizeof(text)-1)
        text[i++] = c;

    text[i]='\0';

    printf("%s\n", text);
    fclose(fp);
}

另见while ((c = getc(file)) != EOF) loop won't stop executing

答案 1 :(得分:5)

ÿ是代码页中的字节255,是EOF强制转换为char的常量feof。您不必使用getc,而是必须int的返回值存储到EOF中,然后将其与while (1) { int c = getc(fp); if (c == EOF) { break; } text[i++] = c; } 进行比较,这里很简单 - 阅读示例(请注意,您还必须进行边界检查):

  driver.findElement(By.id("jobDate")).click();
        Thread.sleep(5000);

        Calendar calendar = new GregorianCalendar();

        int currentDate = calendar.get(Calendar.DAY_OF_MONTH); // get date field
        //System.out.println("date is"+currentDate);

        driver.findElement(By.xpath("//td[contains(text(),'28')]")).click();

        //select date