所以我不完全确定如何使用fread.我有一个little-endian的二进制文件,我需要转换为big-endian,我不知道如何读取文件.这是我到目前为止:
FILE *in_file=fopen(filename, "rb");
char buffer[4];
while(in_file!=EOF){
fread(buffer, 4, 1, in_file);
//convert to big-endian.
//write to output file.
}
Run Code Online (Sandbox Code Playgroud)
我还没有写过任何其他内容,但我只是不确定如何对'进步'有所了解,可以这么说.任何帮助,将不胜感激.
我正在看这个帖子:' 追加多个大数据.表; 使用colClasses和fread进行自定义数据强制; 命名管道 '
我从"马特道尔"看到,这个恐惧" 可以接受非文件,如http地址和连接".我尝试过去通过gzip连接但没有成功.有没有人有一个例子显示如何使用fread读取gzip文件而无需在本地解压缩或使用管道?
现在,我解压缩网络文件在本地使用fread读取它们并将它们附加到已经使用rbindlist读取的其他数据.但是,我认为可能有更快的方法来实现这一目标.
另外,根据"James"的原始问题,如果提供了对gzip文件(或使用其他算法压缩的文件)的支持,那么打开和连接多个文件的提议会很棒.也许允许用户通过fread:
这可能已经存在,我希望有人可以通过我一些示例代码或指向正确的方向.我查看了data.frame R-Forge项目,并将其作为请求/错误提交,但我不能这样做(希望没有人冒犯,如果我在这里发布).
最后,是否有人知道在R中是否可以将文件读入RAM并将句柄传递给该虚拟文件,而无需使用RAM磁盘等?
我希望有人可以帮助我提高代码的性能,目的是读取位于我们网络上的一千个gzip文件,这些文件可能有不同的数据列(即并非所有文件都有相同的列,但它们都有至少有一定程度的重叠).这些文件的总大小约为10Gb.
我最近更新到data.table 1.9.6并在使用时收到以下错误fread:
fread("Aug14.csv")
Error in fread("Aug14.csv") :
4 arguments passed to .Internal(nchar) which requires 3
Run Code Online (Sandbox Code Playgroud)
另一篇文章在另一个上下文中讨论了这个错误,但在升级到data.table 1.9.6之前,这个工作正常.有什么建议?
这是我的设置:
sessionInfo()
R version 3.2.0 (2015-04-16)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.9.6 Matrix_1.2-2
loaded via a namespace (and not attached):
[1] modeltools_0.2-21 tools_3.2.0 splines_3.2.0 grid_3.2.0 chron_2.3-47 …Run Code Online (Sandbox Code Playgroud) 我试图stdin通过setvbuf在`_IOFBF~模式下使用来有效地读取.我是新来的缓冲.我正在寻找有用的例子.
输入以两个整数(n,k)开头.下一n行输入包含1个整数.目的是打印可以整除的整数数k.
#define BUFSIZE 32
int main(){
int n, k, tmp, ans=0, i, j;
char buf[BUFSIZE+1] = {'0'};
setvbuf(stdin, (char*)NULL, _IONBF, 0);
scanf("%d%d\n", &n, &k);
while(n>0 && fread(buf, (size_t)1, (size_t)BUFSIZE, stdin)){
i=0; j=0;
while(n>0 && sscanf(buf+j, "%d%n", &tmp, &i)){
//printf("tmp %d - scan %d\n",tmp,i); //for debugging
if(tmp%k==0) ++ans;
j += i; //increment the position where sscanf should read from
--n;
}
}
printf("%d", ans);
return 0; …Run Code Online (Sandbox Code Playgroud) 我已经制作了一个简单的资源包装器,用于将我的游戏资源打包到一个文件中.在我开始编写解包器之前,一切都很顺利.我注意到我已经打包的.txt文件--26个字节 - 来自资源文件,没有任何问题,保留了所有数据.但是,当读取我在资源文件中打包的.PNG文件时,前5个字节完好无损,而其余的则完全无效.
我追溯到打包过程,我注意到fread只读取.PNG文件的前5个字节,我不能为我的生活找出原因.它甚至触发'EOF'表示文件只有5个字节长,而实际上它是一个787字节的小多边形PNG,100px×100px.
我甚至通过单独的应用程序来简单地将这个PNG文件读入缓冲区来测试这个问题,我得到相同的结果,只读取5个字节.
以下是该小型独立应用程序的代码:
#include <cstdio>
int main(int argc, char** argv)
{
char buffer[1024] = { 0 };
FILE* f = fopen("test.png", "r");
fread(buffer, 1, sizeof(buffer), f);
fclose(f); //<- I use a breakpoint here to verify the buffer contents
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有人可以指出我的愚蠢错误吗?
我有一个大约11.1G的二进制文件,其中存储了Kinect的一系列深度帧.此文件中有19437个帧.要每次读取一帧,我在fstream中使用ifstream,但它在文件的真实结束之前达到eof.(我只得到了前20帧,并且由于eof标志,函数停止了)
然而,所有的帧可以通过读取FREAD在标准输入输出来代替.
谁能解释这种情况呢?感谢您在我的问题上花费宝贵的时间.
这是我的两个功能:
// ifstream.read() - Does Not Work: the loop will stop after 20th frame because of the eof flag
ifstream depthStream("fileName.dat");
if(depthStream.is_open())
{
while(!depthStream.eof())
{
char* buffer = new char[640*480*2];
depthStream.read(buffer, 640*480*2);
// Store the buffer data in OpenCV Mat
delete[] buffer;
}
}
// fread() - Work: Get 19437 frames successfully
FILE* depthStream
depthStream = fopen("fileName.dat", "rb");
if(depthStream != NULL)
{
while(!feof(depthStream))
{
char* …Run Code Online (Sandbox Code Playgroud) 我有一个csv文件,其中列名包括空格和特殊字符.
fread用引号导入它们 - 但是如何更改此行为?一个原因是我的列名以空格开头,我不知道如何处理它们.
任何指针都会有所帮助.
编辑:一个例子.
> packageVersion("data.table")
[1] ‘1.8.8’
p2p <- fread("p2p.csv", header = TRUE, stringsAsFactors=FALSE)
> head(p2p[,list(Principal remaining)])
Error: unexpected symbol in "head(p2p[,list(Principal remaining"
> head(p2p[,list("Principal remaining")])
V1
1: Principal remaining
> head(p2p[,list(c("Principal remaining"))])
V1
1: Principal remaining
Run Code Online (Sandbox Code Playgroud)
当然,我期待/想要的是没有空格的列名产生的结果:
> head(p2p[,list(Principal)])
Principal
1: 1000
2: 1000
3: 1000
4: 2000
5: 1000
6: 4130
Run Code Online (Sandbox Code Playgroud) 这是我正在使用的代码:
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检索电子邮件).
谢谢
我想能够跳过被读成R经由列data.table的fread在v1.8.9功能.但我正在阅读的csv,没有列标题...这似乎是一个问题的fread ...有没有办法只指定我不想要特定的列?
是否更好地预先分配一个列名,然后让它读取它以便可以跳过它?
举个例子......
我从以下URL下载了数据
http://www.truefx.com/dev/data/2013/MAY-2013/AUDUSD-2013-05.zip
拉开它......
并使用fread将csv读入R并且它与csv扩展名具有几乎相同的文件名.
system.time(pp <- fread("AUDUSD-2013-05.csv",sep=","))
user system elapsed
16.427 0.257 16.682
head(pp)
V1 V2 V3 V4
1: AUD/USD 20130501 00:00:04.728 1.03693 1.03721
2: AUD/USD 20130501 00:00:21.540 1.03695 1.03721
3: AUD/USD 20130501 00:00:33.789 1.03694 1.03721
4: AUD/USD 20130501 00:00:37.499 1.03692 1.03724
5: AUD/USD 20130501 00:00:37.524 1.03697 1.03719
6: AUD/USD 20130501 00:00:39.789 1.03697 1.03717
str(pp)
Classes ‘data.table’ and 'data.frame': 4060762 obs. of 4 variables:
$ V1: chr "AUD/USD" "AUD/USD" "AUD/USD" "AUD/USD" ... …Run Code Online (Sandbox Code Playgroud) 我有一个带有额外空格的csv文件,我想将其作为数据帧读入R,剥离空白区域.
这可以通过使用来实现
testdata<-read.csv("file.csv", strip.white=TRUE)
Run Code Online (Sandbox Code Playgroud)
问题是数据集很大并且需要大约半小时.fread函数至少快两倍,但没有strip.white函数.
library("data.table")
testdata<-data.frame(fread("file.csv"))
Run Code Online (Sandbox Code Playgroud)
有没有一种快速的方法可以在读入后从列中剥离空白区域,或者是否有某种方法可以使用fread去除空白区域?
如果它只是一次性导入,我不介意那么多,但我需要多次并经常这样做.