我在执行一个相当简单的任务时遇到了问题:我想在一个函数中读取一个文件,该函数将指向缓冲区的指针作为其参数之一。在函数中,缓冲区应该存放文件的内容,这些内容稍后将在函数外使用。
但是,它显示的内容不正确 readFile()
外面还有更多垃圾readFile
.此外,我想以十六进制 (%02x) 显示文件的内容,但我不知道如何。我正在为指针的东西而苦苦挣扎。你能帮帮我吗?
uint8_t *buffer;
int main(int argc, char *argv[]){
uint32_t i = 0;
unsigned long fileLen;
// Read file
fileLen = readFile(argv[2], &buffer);
printf("Buffer afterward: %s\n", &buffer);
}
unsigned long readFile(char *fileName, uint8_t *buffer){
unsigned long fileLen = 0;
uint8_t i;
FILE *file;
file = fopen (fileName, "r"); /* open the file for reading */
if(file==NULL){
printf("Error reading %c.\n", fileName);
return 0;
}
fseek(file, 0, SEEK_END);
fileLen=ftell(file);
fseek(file, 0, SEEK_SET);
*buffer=malloc(fileLen+1);
if(!buffer)
{
fprintf(stderr, "Memory error!");
fclose(file);
return;
}
fread(&buffer, fileLen, 1, file);
printf("Source message (%s, %ld bytes):\n%s\n", fileName, fileLen, &buffer);
puts("\n");
fclose(file);
return fileLen;
}
这是输出:
´源消息(bla,16 字节): 废话 1234 � � � �UJZ�����
之后缓冲:p`
如果 bla
的内容是:
blablablub<br/>
1234
最佳答案
如果您要在 readFile 函数内分配缓冲区,则假定 buffer
是按引用传递的,而不是按值传递的。即:
unsigned long readFile(char *fileName, uint8_t **buffer);
所以当你为它分配内存时,你使用malloc()
并将得到的地址存储到*buffer
中,但是为了测试分配是否成功,您必须测试 *buffer
,而不是 buffer
。即:
if(!*buffer)
{
fprintf(stderr, "Memory error!");
fclose(file);
return;
}
对于函数的其余部分,您将使用*buffer
,而不是buffer
。
fread(*buffer, fileLen, 1, file);
printf("Source message (%s, %ld bytes):\n%s\n", fileName, fileLen, *buffer);
puts("\n");
fclose(file);
关于c - 填充缓冲区,通过地址作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20097092/