【问题标题】:Problam with fread in CC中的fread问题
【发布时间】:2021-08-09 21:31:47
【问题描述】:

我试图将二进制文件读入动态字符串,但出现了问题。 我无法释放字符串,也无法打印或用它做任何其他事情。 如果我在没有运行良好的所有动态内容的情况下打开它,文件就可以了。

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

#pragma warning (disable: 4996)

#define STR_LEN 50

int main(int args, char** argv)
{
    char filePath[STR_LEN];
    char signaturePath[STR_LEN];
    FILE* file;
    FILE* signature;
    int fileSize;
    int signatureSize;

    strcpy(filePath, argv[2]);
    strcpy(signaturePath, argv[1]);

    file = fopen(filePath, "rb");
    signature = fopen(signaturePath, "rb"); 

    if (file == NULL)
        printf("e:  f\n");
    if (signature == NULL)
        printf("e:  s\n");

    fseek(file, 0L, SEEK_END);
    fileSize = ftell(file);
    fseek(file, 0L, SEEK_SET);

    fseek(signature, 0L, SEEK_END);
    signatureSize = ftell(signature);
    fseek(signature, 0L, SEEK_SET);

    char* fileStr = (char)malloc(sizeof(char) * fileSize + 1);
    char* signatureStr = (char)malloc(sizeof(char) * signatureSize + 1);

    fread(fileStr, fileSize, 1, file);
    fread(signatureStr, signatureSize, 1, signature);



    free(fileStr);
    free(signatureStr);
    fclose(file);
    fclose(signature);

    return 0;
}

【问题讨论】:

  • 正如一点,在您使用args. 检查元素的有效性之前,永远访问argv[] 除非人们证明这一点,否则我不会相信他们提供了任何论据.
  • 另外一点:不要将filePathsignaturePath 声明为数组。不需要复制argv[1]argv[2] 指向的字符串。只需将路径变量声明为const char * 并让它们指向与argv[1]argv[2] 相同的字符串。这样您就不会被限制为 49 个字符长的路径名,而且您不必担心复杂的代码来防止缓冲区溢出。
  • 谢谢。很有帮助。

标签: c file malloc fread


【解决方案1】:

您将malloc() 返回到char 的指针强制转换。在典型环境中,char 为 1 字节长,而指针为 4 字节或 8 字节长。强制转换将截断指针,将它们变成一些无效值。

malloc() 家族的铸造结果是considered as a bad practice。移除有害的演员表进行修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-14
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    相关资源
    最近更新 更多