什么是C fread()的C#模拟?
fread(inbuf, 1, AUDIO_INBUF_SIZE, f);
Run Code Online (Sandbox Code Playgroud)
什么可能是它的确切模拟?
我在工作中创建 PHP telnet 脚本来收集网络数据时遇到了问题。
因为从“Action: Status”命令返回的数据量可以是任意大小...我担心在第 13 行使用 fread() 的静态数字。我也尝试过使用 fgets() 代替,但它只能抓取第一行数据(META HTTP 行...没有表格)。如何使用 PHP 从套接字获取任意数量的数据?请帮忙
<?php
$ami = fsockopen("192.100.100.180", 5038, $errno, $errstr);
if (!$ami) {
echo "ERROR: $errno - $errstr<br />\n";
} else {
fwrite($ami, "Action: Login\r\nUsername: 1005\r\nSecret: password\r\nEvents: off\r\n\r\n");
fwrite($ami, "Action: Status\r\n\r\n");
sleep(1);
$record = fread($ami,9999);#this line could over run!!!
$record = explode("\r\n", $record);
echo "<META HTTP-EQUIV=Refresh CONTENT=\"9\">"; #refresh page every 9 seconds
echo "<table border=\"1\">";
foreach($record as $value){
if(!strlen(stristr($value,'Asterisk'))>0
&& !strlen(stristr($value,'Response'))>0
&& !strlen(stristr($value,'Message'))>0
&& !strlen(stristr($value,'Event'))>0
&& strlen(strpos($value,' …Run Code Online (Sandbox Code Playgroud) 我需要用fread()读取管道读取端的东西.
但是我希望fread()在管道中没有任何内容时设置EOF,而是设置错误指示器.我检查了posix和C标准,但没有发现任何线索.可能我正在做一些无意识的事(读,傻),对:)
这是摘录:
#include <stdio.h>
#include <fcntl.h>
int main()
{
char buf[128];
FILE *f;
int pipe_fd[2], n;
pipe(pipe_fd);
fcntl(pipe_fd[0], F_SETFL, O_NONBLOCK);
f=fdopen(pipe_fd[0], "r");
n=fread(buf, 1, 1, f);
printf("read: %d, Error: %d, EOF: %d\n", n, ferror(f), feof(f));
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有以下关于 C 文件 I/O 的问题。
在物理层面(硬盘驱动器),假设每个fread(n_blocks, size, length,FILE fp)操作都应该花费对第一页(块)的一次随机访问和对同一缓冲区的下一个块的 n-1 次顺序访问是否有效?
我之所以这样假设,是因为操作系统有如此多的进程,大多数情况下可以确定其中一个进程也在每个本地程序之间写入或读取文件,fread并且通过该假设,硬盘驱动器位于另一个扇区/柱面。
这个假设可以吗?
关于我之前的一个问题的后续问题,已得到完美答复.为了快速回顾一下,我在创建一个拥有巨大数组的类时遇到了麻烦(堆栈溢出错误).在答案中,一些用户建议我使用std :: vector代替.
读入数据的功能如下所示:
Test()
{
memset(myarray, 0, sizeof(myarray));
FILE* fstr = fopen("myfile.dat", "rb");
size_t success= fread(myarray, sizeof(myarray), 1, fstr);
fclose(fstr);
}
Run Code Online (Sandbox Code Playgroud)
对于看起来像这样的myarray:
int myarray[45000000];
Run Code Online (Sandbox Code Playgroud)
我的问题是:我怎样才能把它读成一个更好的:
std::vector<int> myvector;
Run Code Online (Sandbox Code Playgroud)
我搜索了谷歌,并找到了多个答案,通常指向以下代码:
std::ifstream input("myfile.dat", std::ios::in | std::ifstream::binary);
std::copy(std::istream_iterator<int>(input),
std::istream_iterator<int>(),
std::back_inserter(myvector));
Run Code Online (Sandbox Code Playgroud)
在实现之后,当调用myvector.size()时,我得到16(无论出于何种原因),并且访问向量元素会导致出现向量边界的立即崩溃.
那么我该怎么做才能做到这一点?我曾经读过某个地方,我可以简单地使用"旧"方法,然后将数组读入矢量,但这似乎首先打败了使用矢量的目的.
我有一个5GB200万行的csv.标题以逗号分隔strings,每行以逗号分隔doubles,没有丢失或损坏的数据.它是矩形的.
我的目标是尽可能快地将行的10%(有或没有替换,无关紧要)读入RAM .缓慢解决方案(但速度快read.csv)的一个例子是读取整个矩阵,fread然后随机保留10%的行.
require(data.table)
X <- data.matrix(fread('/home/user/test.csv')) #reads full data.matix
X <- X[sample(1:nrow(X))[1:round(nrow(X)/10)],] #sample random 10%
Run Code Online (Sandbox Code Playgroud)
然而,我正在寻找最快的解决方案(这很慢,因为我需要首先阅读整个事物,然后修剪它).
值得给予赏金的解决方案将给出system.time()不同备选方案的估计.
其他:
我有一个大数据集(大约 13GB 未压缩),我需要重复加载它。第一次加载(并保存为不同的格式)可能非常慢,但此后的每次加载都应尽可能快。加载数据集的最快方式和最快格式是什么?
我的怀疑是最佳选择是这样的
saveRDS(obj, file = 'bigdata.Rda', compress = FALSE)
obj <- loadRDS('bigdata.Rda)
Run Code Online (Sandbox Code Playgroud)
但这似乎比使用包中的fread函数慢data.table。这不应该是这种情况,因为fread从 CSV 转换文件(尽管它确实是高度优化的)。
大约 800MB 数据集的一些时间是:
> system.time(tmp <- fread("data.csv"))
Read 6135344 rows and 22 (of 22) columns from 0.795 GB file in 00:00:43
user system elapsed
36.94 0.44 42.71
saveRDS(tmp, file = 'tmp.Rda'))
> system.time(tmp <- readRDS('tmp.Rda'))
user system elapsed
69.96 2.02 84.04
Run Code Online (Sandbox Code Playgroud)
这个问题是相关的,但不反映 R 的当前状态,例如一个答案表明从二进制格式读取总是比文本格式快。使用 *SQL 的建议在我的情况下也没有帮助,因为需要整个数据集,而不仅仅是它的一个子集。
还有一些关于加载数据的最快方式的相关问题(例如:1)。
假设我有一个大小为 5000 字节的文件,我正在尝试读取该文件。
我有这个代码:
int main()
{
char *file_path[] = "/path/to/my/file"
FILE *fp= fopen(file_path,"rb"); //open the file
fseek(fp, 0, SEEK_END); // seek to end of file
unsigned long fullsize = ftell(fp); //get the file size (5000 for this example)
fseek(fp, 0, SEEK_SET); //bring back the stream to the begging
char *buf = (char*)malloc(5000);
fread(buf,5000,1,fp);
free(buf);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我也可以将fread呼叫替换为
fread(buf,1000,5,fp);
Run Code Online (Sandbox Code Playgroud)
什么是更好的?为什么?在优化方面,我理解返回值是不同的。
目前正在尝试用 C 编写程序来读取 .bin 文件。正如您在我的代码中看到的那样,我显然遗漏了一些东西,我尝试阅读了很多内容,但仍然完全卡住了。正如预期的那样,我的输出不是预期的。我预期的输出示例是 YV2840 KLT KDAB Thu Jan 16 12:44:00 2014
因为我正在尝试阅读有关航空公司航班的 .bin 文件。我认为它可能是错误的原因如下。
我应该定义一个名为“人类可读的日期字符串”的结构。这当然是不可能的,因为它会产生编译器错误。也许我不应该从字面上理解它,因为现在我将它定义为“时间戳”。
顺序和大小与写入文件的格式不匹配。
这是 bin 文件,如果有人感兴趣:http : //www.filedropper.com/acars 这是我的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct MyStruct_struct {
int FlightNum[7];
char OriginAirportCode[5];
char DestAirportCode[5];
int TimeStamp;
} MyStruct;
int main() {
FILE * bin;
MyStruct myStruct;
bin = fopen("acars.bin", "rb");
while(1) {
fread(&myStruct,sizeof(MyStruct),1,bin);
if(feof(bin)!=0)
break;
printf("%d",myStruct.FlightNum);
printf("%s" ,myStruct.OriginAirportCode);
printf("%s" ,myStruct.DestAirportCode);
printf("%d", myStruct.TimeStamp);
}
fclose(bin);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我在Windows机器上尝试加快read.table步骤。我的文件都是.gz。
x=paste("gzip -c ",filename,sep="")
phi_raw = fread(x)
Error in fread(x) :
Run Code Online (Sandbox Code Playgroud)
无法理解错误。对我来说有点神秘。
不像zx8754所建议的那样重复:专门在fread上下文中使用。尽管fread dows没有对gzip的本机支持,但是这种范例应该可以工作。参见http://www.molpopgen.org/coding/datatable.html
更新资料
根据下面的建议使用系统会产生更长的错误消息-尽管我仍然被卡住。
Error in fread(system(x)) :
'input' must be a single character string containing a file name, a command, full path to a file, a URL starting 'http[s]://', 'ftp[s]://' or 'file://', or the input data itself
In addition: Warning message:
running command 'gzip -c D:/x_.gz' had status 1
Run Code Online (Sandbox Code Playgroud)
更新资料
使用gunzip运行,如下所示:
Error in fread(system(x)) :
'input' must be a single character string containing a file name, …Run Code Online (Sandbox Code Playgroud)