标签: fgetc

getc()vs fgetc() - 主要区别是什么?

在任何地方我都看到"它实际上是相同的"或类似的东西......

来自GNU C编程教程:

GNU C库中还有另一个名为fgetc的函数.它在大多数方面与getc相同,除了getc通常作为宏函数实现并且高度优化,因此在大多数情况下是优选的.(在您从标准输入读取的情况下,getc与fgetc一样快,因为与计算机读取输入的速度相比,人类输入速度较慢,但​​是当您从不是由人工交互生成的流中读取时, fgetc可能更好.)

还有什么区别?我听说他们每个都有不同的实现(一个可以用作宏),但是,是什么让它们与标准C库(或规范)中的它们完全不同(或不同)?

c getc fgetc

45
推荐指数
2
解决办法
4万
查看次数

混淆== EOF vs feof

我打开了一个文件,在指针的地址找到了流ptr.我试图查看文件是否为空.使用以下内容

if (fgetc(ptr) != EOF)
Run Code Online (Sandbox Code Playgroud)

按预期工作.当文件为空时,不执行该语句.当文件不为空时,不执行该语句.

但是,使用

if (!feof(ptr))
Run Code Online (Sandbox Code Playgroud)

总是执行声明.

为什么会这样?有没有办法使用这个feof功能?

c pointers file feof fgetc

12
推荐指数
3
解决办法
6086
查看次数

C fgets与fgetc的阅读线

我需要读取一行文本(由换行符终止),而不对长度做出假设.所以我现在面对各种可能性:

  • fgets每次使用并检查最后一个字符是否为换行符并连续附加到缓冲区
  • 使用fgetc偶尔realloc使用缓冲区读取每个字符

Intuition告诉我fgetc变体可能会变慢,但是我再也看不出如何fgets在不检查每个角色的情况下做到这一点(我的直觉也不总是那么好).线条非常大,因此性能很重要.

我想知道每种方法的优缺点.先感谢您.

c io stdio fgets fgetc

11
推荐指数
1
解决办法
1万
查看次数

fgetc,检查EOF

Linux系统编程一书中,我读过这样的文章:

fgetc返回读取作为字符unsigned char强制转换为intEOF在文件或错误的结束.使用的常见错误fgetc是:

char c;
if ((c = fgetc()) != EOF) {...}
Run Code Online (Sandbox Code Playgroud)

这段代码的正确版本是:

int c;
if ((c = fgetc()) != EOF) { printf("%c", (char)c); ... }
Run Code Online (Sandbox Code Playgroud)

那么,为什么我不能char在比较之前投出一个返回值EOF呢?为什么我要与之EOF完全比较int?如EOF定义的那样-1,它通常不会被投放到char
是否有平台/编译器不适用?

c eof fgetc

10
推荐指数
2
解决办法
8150
查看次数

*可能*未签名的字符等于EOF?

fgetc用于读取流的下一个字符时,通常会检查是否未达到文件结尾

if ((c = fgetc (stream)) != EOF)
Run Code Online (Sandbox Code Playgroud)

哪里cint类型.然后,文件结束已经达到并且条件将失败,或者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的重复.我在第一次搜索时没有找到这个问题.谢谢您帮忙!:-)

c unsigned char eof fgetc

10
推荐指数
1
解决办法
373
查看次数

通过char读取字符串直到C/C++行结束

如何在一个字符串中读取一个字符串,并在到达行尾时停止?我使用fgetc函数从文件读取并将字符放入数组(后者将数组更改为malloc),但无法弄清楚当到达行尾时如何停止

试过这个(c是来自文件的char变量):

if(c=="\0")
Run Code Online (Sandbox Code Playgroud)

但它给出了错误,我无法将指针与整数进行比较

文件看起来像(单词的长度未知):

one
two
three
Run Code Online (Sandbox Code Playgroud)

所以这里有一些问题:1)我可以将c与\ 0进行比较,因为\ 0是两个符号(\和0)或者它被计为一个(与\n相同的问题)2)也许我应该使用\n?3)如果上面的建议有误,你会建议什么(注意我当时必须阅读字符串一个字符)

(注意我对C++很新(并自己编程))

c c++ string file fgetc

9
推荐指数
1
解决办法
15万
查看次数

`fgetc()` 可能返回 `EOF` 的所有原因是什么?

当发生文件结尾输入错误时肯定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("???");
Run Code Online (Sandbox Code Playgroud)

测试是否feof(), ferror()足够?

注意:这里有一个宏,其计算结果通常EOF为负数。它不是end -of-file的同义词。int-1

我发现了一些 与此问题接近的问题以及更多问题,但没有一个问题列举了所有可能性。

c fgetc

8
推荐指数
2
解决办法
1415
查看次数

比较unsigned char和EOF

当编译以下代码时,它进入无限循环:

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;
}
Run Code Online (Sandbox Code Playgroud)

gcc编译器也会在编译时发出警告

abc.c:13:warning: comparison is always true due to limited range of data type
Run Code Online (Sandbox Code Playgroud)

当代码unsigned char被替换为charint按预期时,代码运行正常,即它终止.
但代码也运行unsigned int良好.因为我有我读的EOF就是定义为-1stdio.h那为什么此代码为无符号的字符失败,但运行良好的unsigned int类型.

c comparison eof unsigned-char fgetc

7
推荐指数
2
解决办法
8742
查看次数

检查EOF和fgetc()错误的更好方法是什么?

我总是使用这种方法

int c;
while ((c = fgetc(fp))!=EOF)
{
    printf("%c", c);
}
Run Code Online (Sandbox Code Playgroud)

因为在我看来,它更具可读性和强大性.但是对于我的链接答案,chux评论说

if(feof(fp))比int c更健壮; while((c = fgetc(fp))!= EOF)

    while(1)
    {
        c = fgetc(fp);
        if ( feof(fp) )
        {
            break ;
        }
        printf("%c", c);
    }
Run Code Online (Sandbox Code Playgroud)

比第一个版本更强大.那么我应该使用什么版本?请解释一下为什么这个版本更好.

编辑

问题为什么"while(!feof(file))"总是错的?有人问为什么控制循环中的feof()总是错误的.但feof()以适当的方式检查条件是否总是错误的?解释很明显.

c fgetc

7
推荐指数
2
解决办法
3738
查看次数

fgetc不识别EOF

下面的程序在各种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;
}
Run Code Online (Sandbox Code Playgroud)

c aix types eof fgetc

6
推荐指数
1
解决办法
2301
查看次数

标签 统计

c ×10

fgetc ×10

eof ×4

file ×2

aix ×1

c++ ×1

char ×1

comparison ×1

feof ×1

fgets ×1

getc ×1

io ×1

pointers ×1

stdio ×1

string ×1

types ×1

unsigned ×1

unsigned-char ×1