在PHP中,如何检查流资源(或文件指针,句柄或您想要调用它们的任何内容)是可读还是可写?例如,如果您遇到的情况是您对资源的打开或创建方式一无所知,那么如何检查它是否可读?你如何检查它是否可写?
根据我所做的测试(只使用PHP 5.3.3的常规文本文件),fread()当资源不可读时,不会在任何级别抛出任何错误.它只返回一个空字符串,但它也为空文件执行此操作.理想情况下,最好选择不修改资源本身的检查.通过尝试从中读取资源来测试资源是否可读将改变指针的位置.
相反,fwrite()当资源不可写时,不会在任何级别抛出任何错误.它只返回零.这稍微有用一些,因为如果你试图将一定数量的字节写入文件并fwrite()返回零,那么你就会知道出了什么问题.但是,这仍然不是一种理想的方法,因为在我需要写入它之前知道它是否可写会更好,而不是试图写入它并查看它是否失败.
此外,理想情况下,检查应该适用于任何类型的流资源,而不仅仅是文件.
这可能吗?有这样的事吗?我一直找不到任何有用的东西.提前感谢您的回答.
我想在文本文件中编写一个php对象.php对象就是这样
$obj = new stdClass();
$obj->name = "My Name";
$obj->birthdate = "YYYY-MM-DD";
$obj->position = "My position";
Run Code Online (Sandbox Code Playgroud)
我想在一个文本文件中写这个$ obj.文本文件位于此路径中
$filePath = getcwd().DIRECTORY_SEPARATOR."note".DIRECTORY_SEPARATOR."notice.txt"
Run Code Online (Sandbox Code Playgroud)
我想要一种简单的方法将此对象写入文本文件,并希望读取文件以获取我定义的属性.请帮我.
提前致谢.
我猜它是fgets,但我找不到具体的语法.我正在尝试读出(在字符串中我认为更容易)添加到日志文件的最后一行.
嗨,在我的项目中,我要读取一个.bin文件,其中包含传感器数据short(16 bit values).我正在使用fread函数进入缓冲区,但我觉得读入没有正确发生.我的意思是我写的东西和我读的东西之间没有一致性.你们能否说出这里出了什么问题?这不是我项目中的代码......我只想在这里验证fread和fwrite功能.
#include<stdio.h>
void main()
{
FILE *fp = NULL;
short x[10] = {1,2,3,4,5,6,5000,6,-10,11};
short result[10];
fp=fopen("c:\\temp.bin", "wb");
if(fp != NULL)
{
fwrite(x, 2 /*sizeof(short)*/, 10 /*20/2*/, fp);
rewind(fp);
fread(result, 2 /*sizeof(short)*/, 10 /*20/2*/, fp);
}
else
exit(0);
printf("\nResult");
printf("\n%d",result[0]);
printf("\n%d",result[1]);
printf("\n%d",result[2]);
printf("\n%d",result[3]);
printf("\n%d",result[4]);
printf("\n%d",result[5]);
printf("\n%d",result[6]);
printf("\n%d",result[7]);
printf("\n%d",result[8]);
printf("\n%d",result[9]);
fclose(fp)
}
Run Code Online (Sandbox Code Playgroud)
我做了fread()(HEX值)后:
temp.bin:
01 02 03 04 05 06 e1 8e 88 06 ef bf b6 0b...
Run Code Online (Sandbox Code Playgroud)
我做了fwrite()之后
stdout: …Run Code Online (Sandbox Code Playgroud) 简单的问题,
当我使用fread时:
fread(ArrayA, sizeof(Reg), sizeBlock, fp);
Run Code Online (Sandbox Code Playgroud)
我的文件指针,fp向前移动?
我正在尝试分析存储在 R 和 Mac 上的 SQL 数据库(MS SQL 服务器)中的数据。典型的查询可能会返回几 GB 的数据,而整个数据库只有几 TB。到目前为止,我一直在使用 R 包odbc,它似乎工作得很好。
不过,dbFetch()好像真的很慢。例如,一个有点复杂的查询在大约 6 分钟内在 SQL 服务器中返回所有结果,但如果我运行它odbc然后尝试dbFetch,需要将近一个小时才能将完整的 4 GB 放入 data.frame。我试过分块获取,这有助于适度:https : //stackoverflow.com/a/59220710/8400969。我想知道是否有另一种方法可以更快地将数据通过管道传输到我的 mac,我喜欢这里的思路:快速读取非常大的表作为数据帧
dbFetch当查询的结果是几GB的数据时,有哪些加速的策略?如果问题是data.frame从较大的表生成对象,是否可以通过以不同方式“获取”来节省成本?还有其他可能有帮助的软件包吗?
感谢您的想法和建议!
我在R中使用fread函数将文件读取到data.tables对象.
但是,在阅读文件时,我想跳过以#开头的行,这可能吗?我在fread文档中找不到任何提及.
我几乎不了解Matlab,需要将一些解析例程转换为Python.它们适用于大型文件,它们本身被划分为"块",并且我从文件顶部的校验和开始就很困难.
Matlab到底发生了什么?
status = fseek(fid, 0, 'cof');
fposition = ftell(fid);
disp(' ');
disp(['** Block ',num2str(iBlock),' File Position = ',int2str(fposition)]);
% ----------------- Block Start ------------------ %
[A, count] = fread(fid, 3, 'uint32');
if(count == 3)
magic_l = A(1);
magic_h = A(2);
block_length = A(3);
else
if(fposition == file_length)
disp(['** End of file OK']);
else
disp(['** Cannot read block start magic ! Note File Length = ',num2str(file_length)]);
end
ok = 0;
break;
end
Run Code Online (Sandbox Code Playgroud)
fid是当前正在查看的文件iBlock是一个计数器,你在文件中"阻止"它
magic_l和magic_h稍后与校验和有关,这里是代码(直接来自上面的代码):
disp(sprintf(' Magic_L = %08X, Magic_H = %08X, …Run Code Online (Sandbox Code Playgroud) 通常,为了向连接到Linux终端上的标准输入的程序指示EOF,如果我只按Enter键,则需要按Ctrl + D一次,否则按两次.但我注意到patch命令不同.有了它,如果我按下Enter键,我需要按两次Ctrl + D,否则按三次.(cat | patch相反,如果我在输入任何实际输入之前按下Ctrl + D,它就没有这种奇怪之处.)深入研究patch源代码,我追溯到它的方式循环fread.这是一个做同样事情的最小程序:
#include <stdio.h>
int main(void) {
char buf[4096];
size_t charsread;
while((charsread = fread(buf, 1, sizeof(buf), stdin)) != 0) {
printf("Read %zu bytes. EOF: %d. Error: %d.\n", charsread, feof(stdin), ferror(stdin));
}
printf("Read zero bytes. EOF: %d. Error: %d. Exiting.\n", feof(stdin), ferror(stdin));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在完全按原样编译和运行上述程序时,这是事件的时间表:
fread.fread调用read系统调用.read系统调用返回5.freadread再次呼叫系统呼叫.我试图解析一个bmp文件,fread()当我开始解析时,它会反转我的字节顺序.
typedef struct{
short magic_number;
int file_size;
short reserved_bytes[2];
int data_offset;
}BMPHeader;
...
BMPHeader header;
...
Run Code Online (Sandbox Code Playgroud)
十六进制数据是42 4D 36 00 03 00 00 00 00 00 36 00 00 00; 我正在将十六进制数据加载到struct中fread(&header,14,1,fileIn);
我的问题是幻数应该是0x424d //'BM'fread()它会翻转字节0x4d42 // 'MB'
为什么fread()会这样做,我该如何解决它;
编辑:如果我不够具体,我需要将整个十六进制数据块读入结构,而不仅仅是幻数.我只选择了幻数作为例子.