我试图将文件读入字符数组,但是当我尝试传入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是错误的,还是还有其他事情发生?
由于
答案 0 :(得分:0)
尝试使用fread
阅读文字时,这是一个限制。这样做没有任何问题,但您必须知道该文件是否包含除ASCII字符之外的其他内容(例如 nul-character ),您当然不能将缓冲区的任何部分视为字符串,直到你在某个时候手动 nul-terminate 。
fread
并不保证缓冲区根本不包含 nul-terminatedating 字符 - 并且它不保证读取的第一个字符不是 nul个字符数
同样,将整个文件读入已分配的缓冲区并没有错。这很常见,你只是不能把你读到的内容视为字符串。这是面向字符的,格式化和面向行的输入函数的另一个原因。 (getchar
,fgetc
,fscanf
,fgets
和POSIX getline
,列出一些内容)。 格式化的和面向行的函数保证 nul-terminated 缓冲区,否则,您可以自行考虑已阅读的内容,以及确保你把你的缓冲区终止 - 在把它当作字符串处理之前。