我在这里遇到了一个奇怪的情况。这是一项作业,作为转发,但我在char* fs
中有一个10MB的文件struct block
。我需要遍历它并将每512个字节分配给block
。 short inuse
有四个数据成员short inodeNum
,short numPlace
,char data[506]
和structs
。二进制文件中的数据也是通过char* dataBlock
写的。
我尝试从二进制文件读取512字节到malloced
(char* dataBlock
到512字节大小),然后将struct block
转换为我的memcpy
。我尝试过类型转换,它会返回错误的值。我尝试了#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
short testShort;
int testInt;
} testStruct;
int main(int argc, char* argv[])
{
testStruct temp;
temp.testShort = 640;
temp.testInt = 420;
long fileLength;
FILE* tempFile;
tempFile = fopen(argv[1], "wb+");
fseek(tempFile, 0, SEEK_END);
fileLength = ftell(tempFile);
rewind(tempFile);
char *buffer = (char *)malloc(sizeof(char) * 6);
fwrite(&temp, sizeof(temp), 1, tempFile);
fread(buffer, sizeof(char), 6, tempFile);
fclose(tempFile);
temp2 = (testStruct *)buffer;
printf("%s\n", buffer);
printf("%d\n", temp2->testShort);
return 0;
}
以及位移和按位数学。
我试图制作另一个程序来复制这个过程。
bottom: 0;
答案 0 :(得分:1)
char *buffer = (char *)malloc(sizeof(char) * 6);
fread(buffer, sizeof(char), 6, tempFile);
如评论中所述,您应该使用sizeof(testStruct)
而不是6
,因为编译器可以填充结构,因此大小可以是8
。
您无需创建字符缓冲区并将其强制转换为testStruct
。您可以使用引用并直接读取数据。示例:
testStruct temp2;
fread(&temp2, sizeof(testStruct), 1, tempFile);
在阅读文件之前还要添加rewind
。在此示例中,您似乎不需要文件大小,因此您可以跳过该部分:
int main(int argc, char* argv[])
{
if (argc < 2)
{
printf("error\n");
return 0;
}
testStruct temp = { 640, 420 };
FILE* tempFile;
tempFile = fopen(argv[1], "wb+");
fwrite(&temp, sizeof(temp), 1, tempFile);
rewind(tempFile);
testStruct temp2;
fread(&temp2, sizeof(testStruct), 1, tempFile);
fclose(tempFile);
printf("%d\n", temp2.testShort);
return 0;
}
答案 1 :(得分:-1)
您可能希望将rewind()
函数(未在标准C中定义)的调用替换为fseek(tempFile, 0L, SEEK_SET)
。这会move the current position到文件的开头,并在<stdio.h>
中与您已经使用的文件访问函数一起声明。
顺便说一句,您通常无法使用ftell()
来确定文件的大小,请参阅discussion in the CERT C Coding Standard为什么不能保证这样做。