我需要将文本文件的内容复制到动态分配的字符数组中.
我的问题是获取文件内容的大小; 谷歌揭示我需要使用fseek和ftell,但为此文件显然需要以二进制模式打开,这只会给垃圾.
编辑:我尝试在文本模式下打开,但我得到奇怪的数字.这是代码(为了清楚起见,我省略了简单的错误检查):
long f_size;
char* code;
size_t code_s, result;
FILE* fp = fopen(argv[0], "r");
fseek(fp, 0, SEEK_END);
f_size = ftell(fp); /* This returns 29696, but file is 85 bytes */
fseek(fp, 0, SEEK_SET);
code_s = sizeof(char) * f_size;
code = malloc(code_s);
result = fread(code, 1, f_size, fp); /* This returns 1045, it should be the same as f_size */
Run Code Online (Sandbox Code Playgroud)
Rod*_*ddy 13
问题的根源在于:
FILE* fp = fopen(argv[0], "r");
Run Code Online (Sandbox Code Playgroud)
argv [0]是你的可执行程序,而不是参数.它当然不会是一个文本文件.试试argv [1],然后看看会发生什么.
您不能确定在一个文件的大小人物而不读取数据,除非您使用的是固定宽度的编码.
例如,UTF-8中长度为8个字节的文件可以是长度为2到8个字符的任何文件.
这不是文件API的限制,它是没有从"二进制数据的大小"到"字符数"的直接映射的自然限制.
如果你有一个固定宽度的编码,那么你可以将文件的大小除以每个字符的字节数.ASCII是最明显的例子,但是如果您的文件是用UTF-16编码的,那么您恰好位于将UTF-16代码点视为"本机"内部字符类型(包括Java,.NET和Windows)然后您可以预测要分配的"字符"数量,就像UTF-16是固定宽度一样.(由于U + FFFF上方的Unicode字符在多个代码点中编码,UTF-16是可变宽度,但很多时候开发人员忽略了这一点.)