我看到人们最近在很多帖子中试图读取这样的文件.
码
#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库.它会跳过文件的前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"标签的存在,但声明它"应该没有效果".
我打开了一个文件,在指针的地址找到了流ptr.我试图查看文件是否为空.使用以下内容
if (fgetc(ptr) != EOF)
Run Code Online (Sandbox Code Playgroud)
按预期工作.当文件为空时,不执行该语句.当文件不为空时,不执行该语句.
但是,使用
if (!feof(ptr))
Run Code Online (Sandbox Code Playgroud)
总是执行声明.
为什么会这样?有没有办法使用这个feof功能?
feof()是否为filepointer的当前位置检查eof或检查当前filepointer旁边的位置?
谢谢你的帮助 !
这是我正在使用的代码:
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检索电子邮件).
谢谢
我来自C和C++背景,但也玩一些网络的东西.所有的美国C乡亲(希望)知道,叫feof上FILE*做一个读之前是一个错误.这是经常咒骂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调用期间获取文件大小,但这不适用于所有类型的文件资源,会产生不一致的行为并且速度会变慢.
我是C++的初学者,并试图更好地理解feof().我已经读过,feof()只有在尝试读取文件末尾之后才会将该标志设置为true,这样很多次初学者会比他们期望的那样多读一次while(!feof(file)).我试图理解的是,它实际上是如何解释已经尝试读取文件的末尾?整个文件是否已经读入并且已知的字符数或是否有其他机制在起作用?
我意识到这可能是一个重复的问题,但我一直无法找到它,可能是因为我不知道最好的方式来说出我要问的内容.如果已经有答案,那么链接将非常受欢迎.谢谢.
我需要将坐标输入到数组中,直到遇到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) 所以我做了一件简单的事情,首先我通过 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)
我知道服务器说类似“找不到命令”或类似的内容,但我无法收到此错误,此脚本无限执行。 …
我使用下面的代码从文件中读取一个字符并将其替换为另一个字符,但我有一个错误.转到文件末尾.
怎么了?
我在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)