在任何地方我都看到"它实际上是相同的"或类似的东西......
来自GNU C编程教程:
GNU C库中还有另一个名为fgetc的函数.它在大多数方面与getc相同,除了getc通常作为宏函数实现并且高度优化,因此在大多数情况下是优选的.(在您从标准输入读取的情况下,getc与fgetc一样快,因为与计算机读取输入的速度相比,人类输入速度较慢,但是当您从不是由人工交互生成的流中读取时, fgetc可能更好.)
还有什么区别?我听说他们每个都有不同的实现(一个可以用作宏),但是,是什么让它们与标准C库(或规范)中的它们完全不同(或不同)?
我打开了一个文件,在指针的地址找到了流ptr.我试图查看文件是否为空.使用以下内容
if (fgetc(ptr) != EOF)
按预期工作.当文件为空时,不执行该语句.当文件不为空时,不执行该语句.
但是,使用
if (!feof(ptr))
总是执行声明.
为什么会这样?有没有办法使用这个feof功能?
我需要读取一行文本(由换行符终止),而不对长度做出假设.所以我现在面对各种可能性:
fgets每次使用并检查最后一个字符是否为换行符并连续附加到缓冲区fgetc偶尔realloc使用缓冲区读取每个字符Intuition告诉我fgetc变体可能会变慢,但是我再也看不出如何fgets在不检查每个角色的情况下做到这一点(我的直觉也不总是那么好).线条非常大,因此性能很重要.
我想知道每种方法的优缺点.先感谢您.
在Linux系统编程一书中,我读过这样的文章:
fgetc返回读取作为字符unsigned char强制转换为int或EOF在文件或错误的结束.使用的常见错误fgetc是:Run Code Online (Sandbox Code Playgroud)char c; if ((c = fgetc()) != EOF) {...}这段代码的正确版本是:
Run Code Online (Sandbox Code Playgroud)int c; if ((c = fgetc()) != EOF) { printf("%c", (char)c); ... }
那么,为什么我不能char在比较之前投出一个返回值EOF呢?为什么我要与之EOF完全比较int?如EOF定义的那样-1,它通常不会被投放到char?
是否有平台/编译器不适用?
当fgetc用于读取流的下一个字符时,通常会检查是否未达到文件结尾
if ((c = fgetc (stream)) != EOF)
哪里c是int类型.然后,文件结束已经达到并且条件将失败,或者c应该是unsigned转换为的char int,预期与EOF-c 不同,因为EOF确保为负.很好......显然.
但是有一个小问题......通常char类型不超过8位,而且int必须至少有16位,所以每个unsigned char都可以表示为int.然而,在这种情况下char会有16或32位(我知道,在实践中情况从来都不是这样......),没有理由为什么人们不能拥有sizeof(int) == 1,所以它(理论上!)可能fgetc (stream)返回EOF(或另一个负值)但文件结尾尚未达到......
我错了吗?如果没有达到文件结尾,C标准中是否会阻止fgetc返回EOF?(如果是的话,我找不到它!).或者if ((c = fgetc (stream)) != EOF)语法不完全可移植?...
编辑:的确,这是问题#3860943的重复.我在第一次搜索时没有找到这个问题.谢谢您帮忙!:-)
如何在一个字符串中读取一个字符串,并在到达行尾时停止?我使用fgetc函数从文件读取并将字符放入数组(后者将数组更改为malloc),但无法弄清楚当到达行尾时如何停止
试过这个(c是来自文件的char变量):
if(c=="\0")
但它给出了错误,我无法将指针与整数进行比较
文件看起来像(单词的长度未知):
one
two
three
所以这里有一些问题:1)我可以将c与\ 0进行比较,因为\ 0是两个符号(\和0)或者它被计为一个(与\n相同的问题)2)也许我应该使用\n?3)如果上面的建议有误,你会建议什么(注意我当时必须阅读字符串一个字符)
(注意我对C++很新(并自己编程))
当发生文件结尾或输入错误时肯定fgetc()会返回。
这就是全部吗?这是否意味着没有更多数据可用?EOF
FILE *inf = ...;
int ch;
while ((ch = fgetc(inf)) != EOF) {
  ;
}
if (feof(inf)) puts("End-of-file");
else if (ferror(inf)) puts("Error");
else puts("???");
测试是否feof(), ferror()足够?
注意:这里有一个宏,其计算结果通常EOF为负数。它不是end -of-file的同义词。int-1
我发现了一些 与此问题接近的问题以及更多问题,但没有一个问题列举了所有可能性。
当编译以下代码时,它进入无限循环:
int main()
{
    unsigned char  ch;
    FILE *fp;
    fp = fopen("abc","r");
    if(fp==NULL)
    {
        printf("Unable to Open");
        exit(1);
    }
    while((ch = fgetc(fp))!=EOF)
    printf("%c",ch);
    fclose(fp);
    printf("\n",ch);
    return 0;
}
gcc编译器也会在编译时发出警告
abc.c:13:warning: comparison is always true due to limited range of data type
当代码unsigned char被替换为char或int按预期时,代码运行正常,即它终止.
但代码也运行unsigned int良好.因为我有我读的EOF就是定义为-1在stdio.h那为什么此代码为无符号的字符失败,但运行良好的unsigned int类型.
我总是使用这种方法
int c;
while ((c = fgetc(fp))!=EOF)
{
    printf("%c", c);
}
因为在我看来,它更具可读性和强大性.但是对于我的链接答案,chux评论说
if(feof(fp))比int c更健壮; while((c = fgetc(fp))!= EOF)
如
    while(1)
    {
        c = fgetc(fp);
        if ( feof(fp) )
        {
            break ;
        }
        printf("%c", c);
    }
比第一个版本更强大.那么我应该使用什么版本?请解释一下为什么这个版本更好.
编辑
问题为什么"while(!feof(file))"总是错的?有人问为什么控制循环中的feof()总是错误的.但feof()以适当的方式检查条件是否总是错误的?解释很明显.   
下面的程序在各种Solaris/Linux版本上运行良好,但在AIX上运行不正常.不过,如果我更换while(c!=EOF)与while(c!=0xff)AIX上运行完全正常.
有什么想法吗?我检查了AIX上的fgetc手册页,它应该返回EOF常量!
#include <stdio.h>
#include<unistd.h>
#include <string.h>
int main() {
char c;
  FILE *fp;
  fp = fopen("a.txt", "r");
     c=fgetc(fp);
     while(c!=EOF)
        {
        c=fgetc(fp);
        printf("%d",c);
        }
  fclose(fp);
return 0;
}