fread后的字符数组长度小于预期

时间:2018-02-23 02:20:06

标签: c arrays pointers malloc fread

我试图将文件读入字符数组,但是当我尝试传入MAXBYTES为100的值(参数为FUNCTION FILENAME MAXBYTES)时,字符串数组的长度为7。

 FILE * fin = fopen(argv[1], "r");
    if (fin == NULL) {                                                                                 
      printf("Error opening file \"%s\"\n", argv[1]);
      return EXIT_SUCCESS;
    }
    int readSize;

    //get file size
    fseek(fin, 0L, SEEK_END);
    int fileSize = ftell(fin);
    fseek(fin, 0L, SEEK_SET);
    if (argc < 3) {
      readSize = fileSize;
    } else {
      readSize = atof(argv[2]);
    }

    char *p = malloc(fileSize);     

    fread(p, 1, readSize, fin);
    int length = strlen(p);
    filedump(p, length);

如您所见,p的内存分配始终等于filesize。当我使用fread时,我试图读取100个字节(readSize设置为100应该是)并将它们存储在p中。但是,如果我传入该参数,strlen(p)会导致7。我使用fread是错误的,还是还有其他事情发生?

由于

1 个答案:

答案 0 :(得分:0)

尝试使用fread阅读文字时,这是一个限制。这样做没有任何问题,但您必须知道该文件是否包含除ASCII字符之外的其他内容(例如 nul-character ),您当然不能将缓冲区的任何部分视为字符串,直到你在某个时候手动 nul-terminate

fread并不保证缓冲区根本不包含 nul-terminatedating 字符 - 并且它不保证读取的第一个字符不是 nul个字符数

同样,将整个文件读入已分配的缓冲区并没有错。这很常见,你只是不能把你读到的内容视为字符串。这是面向字符的格式化面向行的输入函数的另一个原因。 (getcharfgetcfscanffgets和POSIX getline,列出一些内容)。 格式化的面向行的函数保证 nul-terminated 缓冲区,否则,您可以自行考虑已阅读的内容,以及确保你把你的缓冲区终止 - 在把它当作字符串处理之前。