如果我跑:
FILE* pFile = fopen("c:\\08.bin", "r");
fpos_t pos;
char buf[5000];
int ret = fread(&buf, 1, 9, pFile);
fgetpos(pFile, &pos);
Run Code Online (Sandbox Code Playgroud)
我得到ret = 9和pos = 9.
但是,如果我跑
FILE* pFile = fopen("c:\\08.bin", "r");
fpos_t pos;
char buf[5000];
int ret = fread(&buf, 1, 10, pFile);
fgetpos(pFile, &pos);
Run Code Online (Sandbox Code Playgroud)
ret = 10如预期的那样,但是pos = 11!
怎么会这样?
这对于发现错误来说是一个很好的问题.没有?至少对初学者好.
#define SIZE 4
int main(void){
int chars_read = 1;
char buffer[SIZE + 1] = {0};
setvbuf(stdin, (char *)NULL, _IOFBF, sizeof(buffer)-1);
while(chars_read){
chars_read = fread(buffer, sizeof('1'), SIZE, stdin);
printf("%d, %s\n", chars_read, buffer);
}
return 0;
}
使用上面的代码,我试图使用重定向从文件中读取./a.out < data.输入文件的内容:
1line
2line
3line
4line
Run Code Online (Sandbox Code Playgroud)
但是我没有得到预期的输出,而是混合了一些图形字符.有什么问题?
提示:(礼貌Alok)
sizeof('1') == sizeof(int)所以,改用1 :-)
看一下这篇文章,了解使用fread的缓冲IO示例.
<?php
$file_name = $_FILES['files']['name'];
$tmp_name = $_FILES['files']['tmp_name'];
$file_size = $_FILES['files']['size'];
$file_type = $_FILES['files']['type'];
// The codes written above work fine and have proper information.
$fp = fopen($tmp_name, 'r'); // This one crashes.
$file_content = fread($fp, $file_size) or die("Error: cannot read file");
$file_content = mysql_real_escape_string($file_content) or die("Error: cannot read file");
fclose($fp);
....
Run Code Online (Sandbox Code Playgroud)
我是PHP的新手.我正在尝试将jpg图像存储为数据库中的blob但是非常挣扎:(我尝试了很多教程并阅读了文档,但仍然没有运气.任何建议或教程可能会帮助我...?
我正在尝试使用以下二进制配置读取二进制文件
00 00 00 1A 79 20 83 DB 44 ...
Run Code Online (Sandbox Code Playgroud)
使用以下功能
static BitArray getBitArray(string filename)
{
FILE *fs = fopen(filename.data(),"r");
fseek (fs , 0 , SEEK_END);
unsigned long s = ftell (fs);
rewind (fs);
unsigned char *buffer = new unsigned char[s+1];
fread(buffer,1,s,fs);
BitArray bArray;
for(int i=0; i<s; i++)
bArray.add(buffer[i]);
delete[] buffer;
fclose(fs);
return bArray;
}
Run Code Online (Sandbox Code Playgroud)
这里BitArray只是我自己的一点操纵类.问题是,对于我上面提到的bin文件,它只读取前三个0,就像这样
00 00 00
Run Code Online (Sandbox Code Playgroud)
即使fseek找到了正确的文件大小.
至于为什么我需要字符串0,是因为00 00 00 1A形成一个32位整数,它恰好小到足以留下三个0x00s.
我怀疑0x00在文件开头的一串s被识别为EOF,所以我尝试在文件前填充一个字符,但它没有完全解决.
可能是什么导致了这个?
我在确定如何正确格式化fread语句方面遇到了一些麻烦.下面的代码只是我练习的一些随机的东西.基本上它将信息填充到第一个数组中,将's'写入文件,然后将文件读入第二个数组(s2).但是,我似乎无法以不会产生错误或返回垃圾的方式形成fread语句.数组是char数据类型,因为如果我理解正确,char使用的内存少于其他数据类型.此练习代码的最终应用是用于数据压缩项目.
#include<stdio.h>
#include<string.h>
FILE *fp;
//file pointer
char s[56];
//first string
char s2[56];
//target string for the fread
int n=0;
//counting variable
int m=0;
int main (void)
{
fp=fopen("test.bin", "w+");
//open a file for reading and writing
strcpy(s, "101010001101010");
//input for the string
for(n=0;n<56;n++)
{
if(s[n]==1)
m=n;
else if(s[n]==0)
m=n;
}
printf("%d\n", m);
//the above for loop finds how many elements in 's' are filled with 1's and 0's
for(n=0;n<m;n++)
{
printf("%c", s[n]);
}
//for loop to print 's'
fwrite(s, …Run Code Online (Sandbox Code Playgroud) 我希望你的帮助应该很容易,我不知道为什么它不起作用.我想从bin中读取第一个数据,我知道它是一个int.我正在使用以下部分代码,但我收到了分段错误:
int main(int argc, char **argv)
{
int *data;
/*opening file*/
FILE *ptr_myfile;
ptr_myfile=fopen(myfile.bin","rb");
if (!ptr_myfile)
{
printf("Unable to open file!\n");
return 1;
}
/*input file opened*/
printf("I will read the first 32-bit number\n");
/*will read the first 32 bit number*/
fread(&data,sizeof(int),1, ptr_myfile);
printf("Data read is: %d\n",*data);
fclose(ptr_myfile);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过这样称呼它:
fread(data,sizeof(int),1, ptr_myfile);
Run Code Online (Sandbox Code Playgroud)
它应该是指针的东西,但我看不到什么.
我用c ++编写了代码,用于加密和解密.第一个代码在向量中创建一个输出,然后使用fwrite将其写入文件,第二个代码使用fread从第一个代码读取输出.以下是我的代码片段:
第一个代码:
.....
string a;
vector<long long int> c;
cout << "message to be encrypted = ";
cin >> a;
cout << endl;
cout << "Encrypted message : ";
for (i=0;i<a.size();i++)
{
x=(int)a.at(i);
cout << x << " ";
c.push_back(powerMod(x,e,n));
}
for (i=0;i<c.size();i++)
{
//cout << char(c.at(i));
}
cout << endl;
//Write ciphertext c to a file
FILE * pWrite;
pWrite = fopen ("ciphertext", "w");
fwrite (&c , sizeof(c), 1, pWrite);
fclose (pWrite);
Run Code Online (Sandbox Code Playgroud)
输出是:
message to be encrypted = …Run Code Online (Sandbox Code Playgroud) TL; DR:为什么freopen(NULL, "rb", stdin)在Windows 上总是失败?
我正在尝试base64在C中重新实现一个从stdin获取输入并将编码的等价物输出到stdout的编码器.我之前的帖子中有一个问题fread是过早发出EOF信号.这是我的主要方法:
int main(void)
{
unsigned char buffer[BUFFER_SIZE];
unsigned char base64_buffer[BASE64_BUFFER];
while (1)
{
TRACE_PUTS("Reading in data from stdin...");
size_t read = fread(buffer, 1, sizeof(buffer), stdin); /* Read the data in using fread(3) */
/* Process the buffer */
TRACE_PRINTF("Amount read: %zu\n", read);
TRACE_PUTS("Beginning base64 encode of buffer");
size_t encoded = base64_encode(buffer, read, base64_buffer, sizeof(base64_buffer));
/* Write the data to stdout */
TRACE_PUTS("Writing data to standard output"); …Run Code Online (Sandbox Code Playgroud) 这里的目的是读取一个csv表,该文件有一个直接的URL.我想使用fread(data.table包),因为read.csv更快,但我有一点问题.
options(scipen=999)
caracteristiques=read.csv(url("https://www.data.gouv.fr/s/resources/base-de-donnees-accidents-corporels-de-la-circulation/20160909-181230/caracteristiques_2015.csv"))
caracteristiques[1,1]
# 201500000001
Run Code Online (Sandbox Code Playgroud)
得到[1,1]元素我有问题.
现在我使用fread:
library(data.table)
caracteristiques=data.table(fread("https://www.data.gouv.fr/s/resources/base-de-donnees-accidents-corporels-de-la-circulation/20160909-181230/caracteristiques_2015.csv",
sep=","))
caracteristiques[1,1]
#
Run Code Online (Sandbox Code Playgroud)
然后我们可以看到一个奇怪的数字.我必须指定options(scipen=0)显示它9.955423e-313我想知道我是否必须在fread中指定一些选项,因为它们在第一列中是大数字.
通过网络我可以读到我应该使用data.table和fread来加载我的数据.
但是当我运行基准测试时,我得到以下结果
Unit: milliseconds
expr min lq mean median uq max neval
test1 1.229782 1.280000 1.382249 1.366277 1.460483 1.580176 10
test3 1.294726 1.355139 1.765871 1.391576 1.542041 4.770357 10
test2 23.115503 23.345451 42.307979 25.492186 57.772522 125.941734 10
Run Code Online (Sandbox Code Playgroud)
代码可以在下面看到.
loadpath <- readRDS("paths.rds")
microbenchmark(
test1 = read.csv(paste0(loadpath,"data.csv"),header=TRUE,sep=";", stringsAsFactors = FALSE,colClasses = "character"),
test2 = data.table::fread(paste0(loadpath,"data.csv"), sep=";"),
test3 = read.csv(paste0(loadpath,"data.csv")),
times = 10
) %>%
print(order = "min")
Run Code Online (Sandbox Code Playgroud)
我明白这fread()应该比read.csv()因为它试图首先将行作为字符读入内存然后尝试将它们转换为整数和因子作为数据类型而更快.另一方面,fread()简单地将所有内容都读作字符.
如果这是真的,不test2应该快于test3?
有人可以解释我,我为什么不archieve一个加速或者至少相同的速度test2为test1 …