c - 填充缓冲区,通过地址作为参数传递

标签 c file pointers

我在执行一个相当简单的任务时遇到了问题:我想在一个函数中读取一个文件,该函数将指向缓冲区的指针作为其参数之一。在函数中,缓冲区应该存放文件的内容,这些内容稍后将在函数外使用。

但是,它显示的内容不正确 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/

相关文章:

java - 如何在 Android Studio 1.3.2 中包含预构建的 .so 库

c - 使用 Makefile 进行简单编译?

Java:为什么我的文件写入不起作用?

pointers - 在 golang 中返回一个指针

c - 段错误: 11 when trying to print linked list

c++ - 从 WAV 文件中获取实际值 C++

c - "cnt += num % 2;"和 "if (num % 2)++cnt;"之间的区别

c# - File.Replace 抛出 IOException

Java:文件重命名检测

c - 双指针队列,deQueue,enQueue