标签: fread

连续两次 fwrites 操作

我在写模式下打开了一个文件,如下所示:

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)
  1. 两个连续的 fwrite 操作会不会互相覆盖
  2. 如果没有,两个连续的 fread 操作是否可以正确填充到我的变量中

例如:

fread(&y,1,sizeof(int),fp);
fread(&z,1,sizeof(char),fp);
Run Code Online (Sandbox Code Playgroud)

如果连续 fread 操作完成,y 和 z 变量是否可以保存 10 和 'm' 的值。

c fwrite fread

2
推荐指数
1
解决办法
2105
查看次数

检查返回值 fread 和 fwrite

#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)

c return-value fwrite fread

2
推荐指数
1
解决办法
2万
查看次数

对于大于 4GiB 的文件,fread 有时会返回错误值

我正在尝试读取一个由 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)

c c++ fread

2
推荐指数
1
解决办法
1040
查看次数

fread 在缓冲区中存储随机字符

我只是尝试使用 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' 并且不再输出随机字符,但我更想知道为什么会这样。

c++ fread readfile

2
推荐指数
1
解决办法
2430
查看次数

C 以二进制模式读/写文件

我创建了一个包含 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)

由于某种原因,我之前创建的文件改变了它的大小,并成为我想要写入其中的文件的副本。

我究竟做错了什么?

先感谢您!

c fopen fseek fwrite fread

2
推荐指数
1
解决办法
4万
查看次数

读取,读取部分读取

我似乎无法在文档中找到有关此的信息。

read系统调用的文件说,它可以读取小于规定。是否read尝试多次阅读?

我知道这freadread. 当我调用时fread,它是否可能从流中读取多次直到它得到 0 或读取指定的字节,或者它只会尝试读取一次?

我正在从内核模块中创建的字符设备中读取数据,它从数据结构传输信息并支持部分读取。我有兴趣读取所有数据,直到它返回 0。

谢谢

c linux system-calls fread

2
推荐指数
1
解决办法
904
查看次数

为什么 fwrite / fread 不像 56.806201550387598?

我正在尝试将结构保存到文件中,然后在另一个程序中再次读取它。我以前从未遇到过此问题,但至少据我所知,我从未尝试将带有值的双变量写入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)

c++ fwrite fread mingw-w64

2
推荐指数
1
解决办法
80
查看次数

使用 C popen(): read() 有效,但 fread() 无效

在 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)

c popen fread

2
推荐指数
1
解决办法
40
查看次数

fread 和 fwrite 结果文件大小不同

我正在 Visual Studio 中编写程序。\n我使用fread和复制了一个文件fwrite。\n输出文件大小比输入文件大。\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}\n
Run Code Online (Sandbox Code Playgroud)\n

c filesize fwrite fread

2
推荐指数
1
解决办法
417
查看次数

fread()表现得很奇怪

我在我的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变量,而且bufunsigned char[8]

现在,在调试时,在ftell以前fread,dummy是262062在ftellfread,dummy是262640虽然我只是"感动" 8个字节..

有没有人知道这可能是什么原因..?谢谢你的帮助 :)

c fread

1
推荐指数
1
解决办法
326
查看次数

标签 统计

fread ×10

c ×8

fwrite ×5

c++ ×3

filesize ×1

fopen ×1

fseek ×1

linux ×1

mingw-w64 ×1

popen ×1

readfile ×1

return-value ×1

system-calls ×1