标签: feof

为什么"while(!feof(file))"总是错的?

我看到人们最近在很多帖子中试图读取这样的文件.

#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char **argv)
{
    char *path = argc > 1 ? argv[1] : "input.txt";

    FILE *fp = fopen(path, "r");
    if( fp == NULL ) {
        perror(path);
        return EXIT_FAILURE;
    }

    while( !feof(fp) ) {  /* THIS IS WRONG */
        /* Read and process data from file… */
    }
    if( fclose(fp) == 0 ) {
        return EXIT_SUCCESS;
    } else {
        perror(path);
        return EXIT_FAILURE;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个__CODE__循环有什么问题?

c file while-loop feof

550
推荐指数
4
解决办法
21万
查看次数

为什么fread会提早到达EOF?

我正在编写一个将文件读入内存的C库.它会跳过文件的前54个字节(标题),然后将余数作为数据读取.我使用fseek来确定文件的长度,然后使用fread来读取文件.

循环运行一次然后结束,因为达到了EOF(没有错误).最后,bytesRead = 10624,ftell(stream)= 28726,缓冲区包含28726个值.我希望fread读取30,000字节,当达到EOF时文件位置为30054.

C不是我的母语所以我怀疑我在某个地方有一个愚蠢的初学者错误.

代码如下:

const size_t headerLen = 54;

FILE * stream;
errno_t ferrno = fopen_s( &stream, filename.c_str(), "r" );
if(ferrno!=0) {
  return -1;
}

fseek( stream, 0L, SEEK_END );
size_t bytesTotal = (size_t)(ftell( stream )) - headerLen; //number of data bytes to read
size_t bytesRead = 0;
BYTE* localBuffer = new BYTE[bytesTotal];
fseek(stream,headerLen,SEEK_SET);
while(!feof(stream) && !ferror(stream)) {
    size_t result = fread(localBuffer+bytesRead,sizeof(BYTE),bytesTotal-bytesRead,stream);
    bytesRead+=result;
}
Run Code Online (Sandbox Code Playgroud)

根据您使用的参考,很明显在模式标志中添加"b"就是答案.寻求骷髅徽章的提名.:-)

该引用在第二段,第二句(虽然不在他们的表中)中讨论它.

MSDN直到页面中间才讨论二进制标志.

OpenGroup提到了"b"标签的存在,但声明它"应该没有效果".

c c++ file-io stdio feof

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

混淆== 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
查看次数

feof()在C中是如何工作的

feof()是否为filepointer的当前位置检查eof或检查当前filepointer旁边的位置?

谢谢你的帮助 !

c file-handling feof

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

使用fgets/fread从fsockopen读取数据

这是我正在使用的代码:

if (!($fp = fsockopen('ssl://imap.gmail.com', '993', $errno, $errstr, 15)))
    echo "Could not connect to host";
$server_response = fread($fp, 256);
echo $server_response;

fwrite($fp, "C01 CAPABILITY"."\r\n");
while (!feof($fp)) {
    echo fgets($fp, 256);
}
Run Code Online (Sandbox Code Playgroud)

我收到了第一个回复:

OK Gimap ready for requests from xx.xx.xx.xx v3if9968808ibd.15 
Run Code Online (Sandbox Code Playgroud)

但随后页面超时.我搜索了stream_set_blocking,stream_set_timeout,stream_select,fread等,但无法让它工作.我需要读取服务器发送的所有数据,然后继续执行其他命令(我将使用imap检索电子邮件).

谢谢

php fgets fsockopen fread feof

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

PHP的feof行为与C的关系

我来自C和C++背景,但也玩一些网络的东西.所有的美国C乡亲(希望)知道,叫feofFILE*做一个读之前是一个错误.这是经常咒骂C和C++新手的东西.这也是PHP实现的情况吗?

我认为它必须是因为文件可能是一个套接字或其他任何在完成阅读之前无法知道大小的东西.但几乎每个PHP示例(即使是在我看过的php.net上发现的那些看起来像这样(并且警报在我脑海中消失):

$f = fopen("whatever.txt", "rb");
while(!feof($f)) {
    echo fgets($f);
}
fclose($f);
Run Code Online (Sandbox Code Playgroud)

我知道最好像这样写这个并避免这个问题:

$f = fopen("whatever.txt", "rb");
while($line = fgets($f)) {
    echo $line;
}
fclose($f);
Run Code Online (Sandbox Code Playgroud)

但这是重点.我试过测试如果我以"错误的方式"做错事情就会失败,但我无法让它导致不正确的行为.这不完全科学,但我认为值得一试.

那么,在PHP feof之前调用是不正确的fread

有几种方法可以让PHP以不同的方式完成C的版本,但我觉得它们有缺点.

  • 他们可以默认为!EOF.这是次优的,因为对于某些角落情况可能不正确.

  • 他们可以在fopen调用期间获取文件大小,但这不适用于所有类型的文件资源,会产生不一致的行为并且速度会变慢.

php feof

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

feof()实际上是如何知道何时到达文件末尾的?

我是C++的初学者,并试图更好地理解feof().我已经读过,feof()只有在尝试读取文件末尾之后才会将该标志设置为true,这样很多次初学者会比他们期望的那样多读一次while(!feof(file)).我试图理解的是,它实际上是如何解释已经尝试读取文件的末尾?整个文件是否已经读入并且已知的字符数或是否有其他机制在起作用?

我意识到这可能是一个重复的问题,但我一直无法找到它,可能是因为我不知道最好的方式来说出我要问的内容.如果已经有答案,那么链接将非常受欢迎.谢谢.

c c++ feof

6
推荐指数
2
解决办法
1687
查看次数

如何在C中使用EOF stdin

我需要将坐标输入到数组中,直到遇到EOF,但我的代码中出现了错误.我用ctrl + Z,ctrl + D.

int main()
{
    int x[1000],y[1000];
    int n=0,nr=0,a,b,i;
    printf("Enter the coordinates:\n");
    while(scanf ( "%d %d ", &a, &b) == 2)
    {
     x[n]=a;
     y[n]=b;
     n++;
    }
    if (!feof(stdin))
    {
       printf("Wrong\n");
    }
    else
    {
       for(i=0;i<n;i++)
       printf("%d %d\n", x[i], y[i]);
    }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c stdin scanf feof

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

feof 产生无限循环

所以我做了一件简单的事情,首先我通过 ssh2_exec (成功验证后)执行命令,然后读取变量中的答案。我的代码如下(未经身份验证)

try {
        $stdout_stream = ssh2_exec($this->connection, $_cmd);
        $stderr_stream = ssh2_fetch_stream($stdout_stream, \SSH2_STREAM_STDERR);
    } catch (Exception $e) {
        $std_output = $e->getMessage();
        return false;
    }

    $output = "";

    while (!feof($stdout_stream)) {
        $output .= fgets($stdout_stream, 4096);
    }

    while (!feof($stderr_stream)) {
        $output .= fgets($stderr_stream, 4096);
    }

    fclose($stdout_stream);
    fclose($stderr_stream);     

    return $output;
Run Code Online (Sandbox Code Playgroud)

例如我尝试执行这样的 cmd:

sudo service httpd stop && sudo service httpd start
Run Code Online (Sandbox Code Playgroud)

因此,当命令执行良好时,一切都很好,响应是

关闭 httpd: [ OK ] 启动 httpd: [ OK ]

但是当我尝试在没有 sudo 的情况下执行这样的命令时

service httpd stop && service httpd start
Run Code Online (Sandbox Code Playgroud)

我知道服务器说类似“找不到命令”或类似的内容,但我无法收到此错误,此脚本无限执行。 …

php feof ssh2-exec

5
推荐指数
1
解决办法
650
查看次数

c中错误的循环

我使用下面的代码从文件中读取一个字符并将其替换为另一个字符,但我有一个错误.转到文件末尾.

怎么了?

我在linux(netbeans IDE)上测试了这个代码并且它是正确的并且工作得很漂亮但是当我尝试在Windows中使用VS 2008时,我发现了一个非结束循环.

//address = test.txt

FILE *fp;
fp=fopen(address,"r+");
if(fp == 0)
{
    printf("can not find!!");
}
else
{
    char w = '0';  /// EDIT : int w;
    while(1)
    {
        if((w = fgetc(fp)) != EOF)
        {
            if((w = fgetc(fp)) != EOF)
            {
                fseek(fp,-2,SEEK_CUR);
                fprintf(fp,"0");
            }
        }
        else
        {
            break;
        }
    }
} 
fclose(fp);
Run Code Online (Sandbox Code Playgroud)

c feof

4
推荐指数
1
解决办法
949
查看次数

标签 统计

feof ×10

c ×7

php ×3

c++ ×2

file ×2

fgetc ×1

fgets ×1

file-handling ×1

file-io ×1

fread ×1

fsockopen ×1

pointers ×1

scanf ×1

ssh2-exec ×1

stdin ×1

stdio ×1

while-loop ×1