gpt4 book ai didi

c - 从 fopen 和/或 fscanf 读取的文件不准确

转载 作者:行者123 更新时间:2023-11-30 18:44:44 25 4
gpt4 key购买 nike

我尝试从此代码读取文件。我正在尝试加载图像并将它们作为字符串存储到我的程序中,以便稍后可以使用 fprintf 将相同的图像创建到新文件中。我不允许使用某些文件复制;我需要将文件作为字符串加载,然后将它们写入新文件。我想要的是一个字符数组,因为一个字符是一个字节,所以该数组与文件大小一样长,并且字符数组的每个元素对应于菱形 block 纹理的一个字节,我也想能够将此字符串从代码写入新文件,并有另一个可以用图像查看器打开的菱形 block 。

#include <stdio.h>
#include <stdlib.h>

char Contents[468];

int main(int argc, char *argv[]) {
char *WD = getenv("HOME");
char Path[strlen(WD)+strlen("/Desktop/diamond_block.png")+1];
sprintf(Path, "%s/Desktop/diamond_block.png", WD);
FILE *File = fopen(Path, "r");
fscanf(File, "%s", Contents);
printf(Contents);
}

结果只有四个字母,âPNG,它应该有数百个字符,这意味着文件没有被完全读取。我怀疑它以某种方式被某些终止字符提前终止,但我该如何解决我的问题?

最佳答案

这是对您的问题的非常基本的回答。通过下面的代码,您可能会明白您的问题是什么。该代码需要仔细检查以拦截所使用的函数可能返回的所有错误。顺便说一下......享受它!

代码将整个文件fname加载到char数组imgMem中。它计算变量 n 上的文件尺寸,为数组 imgMem (malloc) 分配内存,然后将整个文件加载到 >imgMem (fread)。

然后代码以两种格式写入文件的前 30 个字节:

  • 字节的十六进制值
  • 如果字节具有控制台表示形式,则为 char 值(否则打印 )
<小时/>

代码如下:

#include <unistd.h>
#include <stdio.h>
#include <malloc.h>

int main(void)
{
const char * fname = "/home/sergio/Pictures/vpn.png";

FILE * fptr;
char * imgMem=NULL;
long n;
int i;

fptr=fopen(fname, "r");

//Determine the file dimension
fseek(fptr,0,SEEK_END); n=ftell(fptr);

//Set the file cursor to the beginning
fseek(fptr,0,SEEK_SET);

printf("The file is %lu byte long.\n\n",n);

//Allocate n bytes to load the file
imgMem = malloc((size_t)n);

//Load the file
fread(imgMem,(size_t)n,1,fptr);;

for(i=0; i<30; i++) {
printf("[%02X %c] ",
(unsigned char)imgMem[i],
(imgMem[i]>31 && imgMem[i]<127)?
imgMem[i]:'.'
);

if ((i+1)%8==0)
puts("");
}

puts("");

free(imgMem);

fclose(fptr);

return 0;
}

关于c - 从 fopen 和/或 fscanf 读取的文件不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56819361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com