哪个更快?ifstream或fread。
我应该使用哪个读取二进制文件?
fread()将整个文件放入内存。
因此fread,访问之后,访问它创建的缓冲区很快。
是否ifstream::open()将整个文件放入内存?
还是我们每次运行都会访问硬盘ifstream::read()?
所以... ifstream::open()== fread()吗?
或(ifstream::open(); ifstream::read(file_length);)== fread()?
还是我应该使用ifstream::rdbuf()->read()?
编辑: 我的readFile()方法现在看起来像这样:
void readFile()
{
std::ifstream fin;
fin.open("largefile.dat", ifstream::binary | ifstream::in);
// in each of these small read methods, there are at least 1 fin.read()
// call inside.
readHeaderInfo(fin);
readPreference(fin);
readMainContent(fin);
readVolumeData(fin);
readTextureData(fin);
fin.close();
}
Run Code Online (Sandbox Code Playgroud)
小方法中的多个fin.read()调用会降低程序速度吗?我应该只在main方法中使用1 fin.read()并将缓冲区传递给较小的方法吗?我想我要写一个小程序进行测试。
谢谢!
首先,我通过调用fread将文本读入缓冲区,然后我想逐行读取它,怎么做?我尝试使用sscanf,但它似乎不起作用.
char textbuf[4096];
char line[256];
FILE *fp;
fp = fopen(argv[1],"r");
memset(textbuf, 0, 4096);
fread(textbuf, 1, 4096, fp);
Run Code Online (Sandbox Code Playgroud)
我知道使用fgets是一个好方法.我只是想知道天气这种方法可以做同样的事情.
尝试使用c fread()调用从简单的文本文件中读取时,我收到一个非常奇怪的错误.
我做了一个非常简单的程序来显示错误:
int main(int argc ,char ** argv) {
FILE* fh = fopen("adult.txt","r");
if(fh==NULL){
printf("error opening file\n");
exit(0);
}
int s = 1000;
printf("cur before=%d\n",ftell(fh));
char* b = malloc (sizeof(char)*s);
int k =fread(b,sizeof(char),s,fh);
printf("cur after reading %d bytes =%d\n",k,ftell(fh));
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
我得到的是输出:
cur before=0
cur after reading 1000 bytes =1007
Run Code Online (Sandbox Code Playgroud)
这是正常的吗?fread返回数字'1000',但光标(用ftell())显示1007,任何帮助将不胜感激.
我正在编写一个简单的程序,写入二进制文件,关闭它,然后读取刚刚写入的数据.我正在尝试编写一个无符号字符数组.我在阅读数据时遇到了一些问题.我不确定我是在写不正确的数据还是读错了.当我读取数据时,我得到的输出为:5 bytes对于读取的字节数,但我得到的输出与我写入文件的值不同.
FILE *binFile = fopen("sample","wb");
unsigned char data[5]={5,10,15,20,25};
fwrite(data,sizeof(unsigned char),sizeof(data),binFile);
fclose(binFile);
unsigned char data2[5];
binFile = fopen("sample","rb");
int s = fread(data2,1,sizeof(data),binFile);
fclose(binFile);
cout<<s<<" bytes\n";
for(int i=0; i<5;i++)
cout<<data2[i]<<" ";
cout<<"\n";
Run Code Online (Sandbox Code Playgroud) 我正在尝试将文件的内容读入结构中。该结构如下所示:
typedef struct{
unsigned char e_ident[EI_NIDENT] ;
Elf32_Half e_type;
Elf32_Half e_machine;
Elf32_Word e_version;
Elf32_Addr e_entry;
Elf32_Off e_phoff;
Elf32_Off e_shoff;
Elf32_Word e_flags;
Elf32_Half e_ehsize;
Elf32_Half e_phentsize;
Elf32_Half e_phnum;
Elf32_Half e_shentsize;
Elf32_Half e_shnum;
Elf32_Half e_shstrndx;
} Elf32_Ehdr;
extern Elf32_Ehdr elfH;
Run Code Online (Sandbox Code Playgroud)
它基本上是一个ELF头文件。所以,无论如何我想将文件的内容加载到这个结构中。
该函数看起来像这样。
Elf32_Ehdr elfH;
int load(char* fname){
FILE* file = fopen(fname,"r");
if(NULL == file) return 0;
fread(&elfH, 1, 52, file);
fclose(file);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
因为它似乎无法正常工作。elfH 的内容不符合预期。可能是什么问题?我是不是该
在用于fread()的R文档中,据说"input"参数可以是以http://或file://开头的URL.但是在" data.table简介 "中,vignette fread()与https一起使用:
flights <- fread("https://raw.githubusercontent.com/wiki/arunsrinivasan/flights/NYCflights14/flights14.csv")
Run Code Online (Sandbox Code Playgroud)
这导致"download.file中的错误(输入,tt,mode ="wb"):不支持的URL方案"控制台消息.
我无法弄清楚如何让它发挥作用.我已经尝试过设置选项(download.file.method ="curl")或"auto",但似乎没有任何帮助.
我究竟做错了什么?
我有一个数据(大数据125000行,~20 MB),其中一些具有特定字符串的行需要删除,并且在读取过程中需要选择一些列.
首先,我发现grepl函数不能正常工作,因为fread在这个问题中也将数据作为一列表示.
可以在此处找到示例数据(通过遵循@akrun建议)和这样的数据标题
头(sum_data)
TRIAL : 1 3331 9091
TRIAL : 2 1384786531 278055555
2 0.10 0.000E+00 -0.0047 -0.0168 -0.9938 -0.0087 -0.0105 -0.9709 0.0035 0.0079 -0.9754 0.0081 0.0023 0.9997 -0.135324E-09 0.278754E-01
2 0.20 0.000E+00 -0.0121 0.0002 -0.9898 -0.0364 -0.0027 -0.9925 -0.0242 -0.0050 -0.9929 0.0029 -0.0023 0.9998 -0.133521E-09 0.425567E-01
2 0.30 0.000E+00 0.0193 -0.0068 -0.9884 0.0040 0.0139 -0.9782 -0.0158 0.0150 -0.9814 0.0054 -0.0008 0.9997 -0.134103E-09 0.255356E-01
2 0.40 0.000E+00 -0.0157 0.0183 -0.9879 …Run Code Online (Sandbox Code Playgroud) 我正在使用data.table::freadWindows 10计算机上的.csv文件中读取数据.数据正确读入read.csv; 但是,当我fread用来读入数据时,结果data.table的每一行中的所有最终列都以a结尾\r,可能表示回车.这会导致数字字段被赋予字符数据类型.(而不是数字文字4.53,行结束单元格将包含字符文字4.53\r.)
为什么会出现这个错误?有没有办法通过函数调用直接解决这个问题fread?
更新
verbose = TRUE使用参数时,我得到以下内容
Input contains no \n. Taking this to be a filename to open
File opened, filesize is 0.000001 GB.
Memory mapping ... ok
Detected eol as \n only (no \r afterwards), the UNIX and Mac standard.
Positioned on line 1 after skip or autostart
This line is the autostart and not blank so searching up for the last …Run Code Online (Sandbox Code Playgroud) 我已经安装了“ microbenchmark”软件包,然后运行:library(microbenchmark)。
现在,我正在尝试读取一个csv文件,但收到错误消息:"fread" function not found。
setwd("C:/Data Analytics/R Assignments")
library(microbenchmark)
data <- fread("BigDiamonds.csv")
Error in
fread("BigDiamonds.csv") : could not find function "fread"
Run Code Online (Sandbox Code Playgroud)
我一直在使用R 3.4。这可能是问题吗?
我有一个文本文件来阅读和处理20000行.在文本文件中,我想读取点坐标并分配给DirectX进行渲染.文本文件的快照
我使用std :: ifstream,getline,stringstream来获取点坐标.在构建win32程序然后开始运行之后,读取并存储数组中的点坐标需要很长时间.(5分钟通过20000行文本文件).代码如下:
struct PointCoord { std::string PtName; float PtX = 0.0; float PtY = 0.0;}
PointCoord *PointPtr = NULL;
PointCoord pointcoord;
std::ifstream File_read(FileNameTXT);
while (getline(File_read, TextHandler))
{
std::istringstream iss;
std::string skip;
if (TextHandler.find(" POINT ") != std::string::npos)
{
iss.str(TextHandler);
std::string TempX, TempY;
iss >> skip;
iss >> pointcoord.PtName;
//pointcoord pass value to PointCoord
iss >> TempX;
iss >> TempY;
pointcoord.PtX = std::stof(TempX.c_str());
pointcoord.PtY = std::stof(TempY.c_str());
//dynamically store the points coordiantes
if (PointPtr == NULL)
{
PointPtr = …Run Code Online (Sandbox Code Playgroud)