假设我读了这样的字节数:
$data = fread($fp, 4096);
Run Code Online (Sandbox Code Playgroud)
因为fread如果它到达文件的末尾会停止读取,我怎么能确切地知道读了多少?会strlen($data)工作吗?或者这可能是错的?
我想要完成的是读取一些字节,然后在我阅读之前回到原来的位置.我试图避免使用算术(ftell,fread,ftell,subract, fseek),因为文件可能是大于PHP_INT_MAX和潜在的混乱,向上.我想要的只是做fseek($fp, -$bytes_read, SEEK_CUR),但为此我需要知道我刚读了多少字节...
我的文本文件包含以下内容:
12345678901222344567
Run Code Online (Sandbox Code Playgroud)
然后我用这段代码来阅读内容:
FILE * pFile;
int c;
char buffer [256];
pFile = fopen ("myfile.txt","r");
int a[50] = {0};
fread(a, sizeof(a[0]), 5, pFile);
fclose(pFile);
for (c = 0; c < 5; c++)
{
printf("%d\n", a[c]);
}
Run Code Online (Sandbox Code Playgroud)
我得到了结果:

我无法解释自己为什么会得到这样的结果.
我有一个文件file.txt
干
print os.path.getsize(filename)
Run Code Online (Sandbox Code Playgroud)
输出
6510
并做
print len(open(filename).read())
Run Code Online (Sandbox Code Playgroud)
抓住我
6355
怎么会 ?我正在使用Windows 7.如果我查看Windows资源管理器中的文件属性,它说
大小:6.35 KB(6,510字节)
我在下面的代码的帮助下阅读一个波斯语文本文件(使用PHP):
/* Reading the file name and the book (UTF-8) */
if(file_exists($SourceDirectoryFile))
{
$NameBook = "name.txt";
$AboutBook = "about.txt";
$myFile = "Computer-Technolgy/2 ($i)/".$NameBook;
$fh = fopen($myFile, 'r');
$theData = fread($fh, filesize($myFile));
fclose($fh);
echo 'Name file: '. $theData.'<hr/>';
}
Run Code Online (Sandbox Code Playgroud)
name.txt文件内容:
????? ???? ??? ????????? (LEARNING NETWORK)
Run Code Online (Sandbox Code Playgroud)
姓名档案: (学习网络)
我有一个二进制文件,我可以在MATLAB中打开,但无法在Python中打开.二进制文件被编码为'双浮点',因此由MATLAB读取,具有以下行:
fread(fopen(fileName), 'float64');
Run Code Online (Sandbox Code Playgroud)
在Python中,我不确定如何复制这一行.我认为使用Numpy将是一个很好的起点,所以我尝试了以下几行,但没有得到我预期的输出.每行有6个数字,我只得到第一个和一个'NaN'.
from numpy import *
f = open('filename', 'rb')
a = fromfile(f, double64, 10)
print a
Run Code Online (Sandbox Code Playgroud)
对此的任何帮助都将非常感激; 我在下面的评论中发布了二进制文件和MATLAB解析文件.我也不需要特别使用Numpy,我对任何基于Python的解决方案都持开放态度.谢谢.
以下是在读取空文件时给出分段错误的示例代码.
#include <stdio.h>
main()
{
FILE *fp;
int i = 0;
char buffer[20];
printf("1\n");
fp = fopen("/home/amadhab/aa", "r+");
printf("2\n");
i = fread(buffer, 1, 1, fp);
printf("3\n");
printf("i = %d\n", i);
}
Run Code Online (Sandbox Code Playgroud)
给o/p一个
1
2
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
确实fread()无法读取空(0KB)文件?
据我所知,在各种编程语言中,例如MatLab和C++,fread被用作读取二进制文件的一种方式.我想知道这究竟是如何起作用的?特别是,fread如何知道从二进制文件中读入了一个新数字; 是否有某种分隔符?
编辑:感谢repliers我已将fread更改为(... sizeof buffer,1,...),但现在我在valgrind中收到此错误:
==2409== Invalid read of size 4
==2409== at 0x51AB8D0: fread (iofread.c:41)
==2409== by 0x4007B6: main (recover2.c:31)
==2409== Address 0x5502000 is not stack'd, malloc'd or (recently) free'd
==2409==
==2409== Use of uninitialised value of size 8
==2409== at 0x51B8787: _IO_sgetn (genops.c:495)
==2409== by 0x51AB93E: fread (iofread.c:42)
==2409== by 0x4007B6: main (recover2.c:31)
==2409==
==2409== Invalid read of size 8
==2409== at 0x51B8787: _IO_sgetn (genops.c:495)
==2409== by 0x51AB93E: fread (iofread.c:42)
==2409== by 0x4007B6: main (recover2.c:31)
==2409== Address 0x40 is not …Run Code Online (Sandbox Code Playgroud) 在我的环境中,以下代码运行正常,但它是否可以保证好?
FILE *file = fopen("in", "r");
int *read_to = NULL;
size_t count = 0;
size_t read = fread(read_to, sizeof(*read_to), count, file);
fclose(file);
Run Code Online (Sandbox Code Playgroud)
分别
FILE *file = fopen("out", "w");
int *write = NULL;
size_t count = 0;
size_t written = fwrite(write, sizeof(*write), count, file);
fclose(file);
Run Code Online (Sandbox Code Playgroud) 在具有两个线程的Windows程序中:thread1和thread2.
当thread1在fread(buffer, 1, 10, stdin)等待输入的呼叫中被阻止时,是否可以执行某些操作thread2以强制fread返回?
到目前为止,我打过电话fclose(stdin)的thread2,但它似乎并没有工作.程序在fclose调用时卡住,直到stdin流中有一些输入为止.
我想要实现的是thread1优雅地终止而不是仅仅用它来杀死它TerminateThread,因为最后还有一些工作thread1需要做.
另一件需要考虑的事情是它stdin是命名管道的一端.我无法控制管道另一端的程序.
我需要的是断开我的程序与管道的末端(stdin在这种情况下).