我在写模式下打开了一个文件,如下所示:
int a = 10;
char b = 'm';
int y = 0;
char z;
FILE *fp = NULL;
fp = fopen("/config/gps_backup.dat","w");
Run Code Online (Sandbox Code Playgroud)
我正在对文件执行两个变量的 frwite(第一个是整数,第二个是字符),如下所示:
fwrite(&a,1,sizeof(int),fp);
fwrite(&b,1,sizeof(char),fp);
Run Code Online (Sandbox Code Playgroud)
例如:
fread(&y,1,sizeof(int),fp);
fread(&z,1,sizeof(char),fp);
Run Code Online (Sandbox Code Playgroud)
如果连续 fread 操作完成,y 和 z 变量是否可以保存 10 和 'm' 的值。
塔
#include <stdio.h>\n#include <stdlib.h>\n\nint main(int argc, char *argv[]){\n\n if(argc != 3){\n printf("Usage: ./copy filename newfile\\n");\n exit(1);\n }\n\n int bytes;\n long file_size, file_copied_size;\n FILE *file_to_copy, *new_file;\n\n if((file_to_copy = fopen(argv[1], "rb")) == NULL){\n printf("File cannot be opened - read\\n");\n exit(1);\n }\n if((new_file = fopen(argv[2], "wb")) == NULL){\n printf("File cannot be opened - write\\n");\n exit(1);\n }\n\n fseek(file_to_copy, 0, SEEK_END);\n file_size = ftell(file_to_copy);\n rewind(file_to_copy);\n\n char *buffer = malloc(1024 * 1024); /* Imposto un buffer di 1MB per maggiore efficienza */ \n if(!buffer){\n printf("Errore allocazione memoria\\n");\n …Run Code Online (Sandbox Code Playgroud) 我正在尝试读取一个由 30e6 个位置组成的大二进制文件,每个位置有 195 个双精度数。由于文件太大而无法全部读入内存,因此我按 10000 个位置分块读取它。然后我用它进行一些计算并读取下一个块......
由于我需要随机访问文件,因此我编写了一个函数来从文件中读取给定块(无符号整数块)并将其存储在 **chunk_data 中。该函数返回读取的位置总数。
unsigned int read_chunk(double **chunk_data, unsigned int chunk) {
FILE *in_glf_fh;
unsigned int total_bytes_read = 0;
// Define chunk start and end positions
unsigned int start_pos = chunk * 10000;
unsigned int end_pos = start_pos + 10000 - 1;
unsigned int chunk_size = end_pos - start_pos + 1;
// Open input file
in_glf_fh = fopen(in_glf, "rb");
if( in_glf_fh == NULL )
error("ERROR: cannot open file!");
// Search start position
if( fseek(in_glf_fh, …Run Code Online (Sandbox Code Playgroud) 我只是尝试使用 fread 读取文件并输出内容。它部分工作。它正确输出所有内容,但以一堆随机字符结尾。
#include <iostream>
using namespace std;
void ReadFile(char* filename,char*& buffer)
{
FILE *file = fopen(filename,"rb");
fseek(file,0,SEEK_END);
int size = ftell(file);
rewind(file);
buffer = new char[size];
memset(buffer,0,size);
int r = fread(buffer,1,size,file);
cout << buffer;
fclose(file);
}
int main()
{
char* buffer;
ReadFile("test.txt",buffer);
cin.get();
}
Run Code Online (Sandbox Code Playgroud)
假设在这种情况下“大小”是 50。出于某种原因,调用 fread 后缓冲区的大小最终为 55 或 56。我在使用它之前清空了缓冲区并尝试输出它,一切正常(它是空的)。在调用 fread 之后,缓冲区以某种方式变大并填充了随机字符。我已经在十六进制编辑器中打开了文本文件,以确保没有我没有看到但没有看到的任何内容。该文件为 50 字节。fread 返回读取的字节数,在这种情况下返回到 'r','r' 应该是什么。那么这些字节的母 eff 是从哪里来的呢?
简化: fread 返回正确的读取字节数,但缓冲区在调用 fread 后以某种方式使自身变大,然后用随机字符填充它。为什么?
我一生都无法弄清楚这是怎么发生的。
此外,在任何人给我一个简单的修复之前,我已经知道我可以只做 buffer[r] = '\0' 并且不再输出随机字符,但我更想知道为什么会这样。
我创建了一个包含 4000 个块的文件,块大小为 4096 字节。现在我想操作单个块并再次读取它们而不更改文件的大小。实际上我想将另一个文件中的块写入我创建的文件中的特定块。因此,我以二进制模式打开文件,如下所示:
FILE * storeFile=fopen(targetFile, "wb"); // this one I created before
FILE * sourceFILE=fopen(sourceFile,"rb");
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试将内容读取到指针
char * ptr=malloc(4096);
...
for(i=0; i<blocks_needed; i++)
{
fread(ptr,4096,1,sourceFile);
// now I am going to the position of the blocks I want to write to
fseek(storeFile,freeBlocks[i]*4096,SEEK_SET);
// and now I am writing it to the File I created before
fwrite(ptr,4096,1,storeFile);
...
}
Run Code Online (Sandbox Code Playgroud)
由于某种原因,我之前创建的文件改变了它的大小,并成为我想要写入其中的文件的副本。
我究竟做错了什么?
先感谢您!
我似乎无法在文档中找到有关此的信息。
该read系统调用的文件说,它可以读取小于规定。是否read尝试多次阅读?
我知道这fread是read. 当我调用时fread,它是否可能从流中读取多次直到它得到 0 或读取指定的字节,或者它只会尝试读取一次?
我正在从内核模块中创建的字符设备中读取数据,它从数据结构传输信息并支持部分读取。我有兴趣读取所有数据,直到它返回 0。
谢谢
我正在尝试将结构保存到文件中,然后在另一个程序中再次读取它。我以前从未遇到过此问题,但至少据我所知,我从未尝试将带有值的双变量写入56.806201550387598文件。并不是说我不知道为什么这个数字会产生任何问题,但是每当我尝试将包含该值的结构写入文件时,该字段及其后声明的任何字段都只能从该结构中读出初始化值宣言。
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
typedef struct statsSet{
int pathCount = 0;
double vMinMean = 0;
int imgsFound = 0;
int minWidth = INT_MAX;
int maxWidth = 0;
}statsSet;
void wrightToFile(statsSet sSet){
FILE* of = fopen ("imgStats2.dat", "w");
fwrite (&sSet, sizeof(statsSet), 1, of);
fclose (of);
}
statsSet readFromFile(){
statsSet statReadIn;
FILE *ifl = fopen ("imgStats2.dat" , "r");
fread(&statReadIn, sizeof(statsSet), 1, ifl);
fclose (ifl);
return statReadIn;
}
void pr(statsSet statReadIn){
cout << "pathCount: " …Run Code Online (Sandbox Code Playgroud) 在 popen() 之后,fread() 总是返回 0。将 read() 与 fileno(fp) 一起使用是可行的。这是怎么回事?
这是代码。
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
FILE *fp = popen("echo hello", "r");
if (!fp) {
perror("echo hello");
} else {
char buffer[128];
for (;;) {
int n;
if (argc < 2) {
n = fread(buffer, sizeof buffer, 1, fp);
} else {
n = read(fileno(fp), buffer, sizeof buffer);
}
printf("read %d bytes\n", n);
if (n <= 0) break;
fwrite(buffer, n, 1, stdout);
}
pclose(fp); …Run Code Online (Sandbox Code Playgroud) 我正在 Visual Studio 中编写程序。\n我使用fread和复制了一个文件fwrite。\n输出文件大小比输入文件大。\n你能解释一下原因吗?
#define _CRT_SECURE_NO_WARNINGS\n#include <stdio.h>\n#include <stdlib.h>\n#include <memory.h>\n\nint main()\n{\n char *buffer;\n int fsize;\n\n FILE *fp = fopen("test.txt", "r");\n FILE *ofp = fopen("out.txt", "w");\n fseek(fp, 0, SEEK_END);\n fsize = ftell(fp);\n\n buffer = (char *)malloc(fsize);\n memset(buffer, 0, fsize); // buffer\xeb\xa5\xbc 0\xec\x9c\xbc\xeb\xa1\x9c \xec\xb4\x88\xea\xb8\xb0\xed\x99\x94\n\n fseek(fp, 0, SEEK_SET);\n fread(buffer, fsize, 1, fp);\n\n fwrite(buffer, fsize, 1, ofp);\n\n fclose(fp);\n fclose(ofp);\n free(buffer);\n}\nRun Code Online (Sandbox Code Playgroud)\n 我在我的C程序中遇到问题,在我使用之后fread(),文件指针有时会转到文件的末尾.
我会尝试更好地解释 - 代码看起来像:
dummy = ftell(fp);
fread(&buf, sizeof(unsigned char), 8, fp);
dummy = ftell(fp);
Run Code Online (Sandbox Code Playgroud)
哪个fp是打开文件的文件指针(用"w +"打开它,我用它作为二进制文件,我知道我也应该有一个"b",但我听说它不是很重要添加它..),
dummy只是一个unsigned long变量,而且buf是unsigned char[8]
现在,在调试时,在ftell以前fread,dummy是262062在ftell后fread,dummy是262640虽然我只是"感动" 8个字节..
有没有人知道这可能是什么原因..?谢谢你的帮助 :)