相关疑难解决方法(0)

如何确定C中文件的大小?

如何计算文件的大小(以字节为单位)?

#include <stdio.h>

unsigned int fsize(char* file){
  //what goes here?
}
Run Code Online (Sandbox Code Playgroud)

c io file filesize

132
推荐指数
7
解决办法
12万
查看次数

可以通过fseek()读取整个文件到SEEK_END并通过ftell()获取文件大小吗?

我是对的,这段代码引入了未定义的行为?

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

FILE *f = fopen("textfile.txt", "rb");
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
fseek(f, 0, SEEK_SET);  //same as rewind(f);

char *string = malloc(fsize + 1);
fread(string, fsize, 1, f);
fclose(f);

string[fsize] = 0;
Run Code Online (Sandbox Code Playgroud)

我之所以要问的是,这段代码是作为以下问题的一个被接受且高度评价的答案发布的:C编程:如何将整个文件内容读入缓冲区

但是,根据以下文章:如何在C++中读取整个文件到内存中(尽管它的标题,它也处理C,所以坚持我):

假设您正在编写C,并且您有FILE*(您知道指向文件流,或者至少是可搜索流),并且您想要确定在缓冲区中分配多少个字符来存储流的全部内容.你的第一直觉可能是编写这样的代码:

// Bad code; undefined behaviour
fseek(p_file, 0, SEEK_END);
long file_size = ftell(p_file);
Run Code Online (Sandbox Code Playgroud)

似乎是合法的.但后来你开始变得怪异了.有时报告的大小大于磁盘上的实际文件大小.有时它与实际文件大小相同,但您读入的字符数不同.这到底是怎么回事?

有两个答案,因为它取决于文件是以文本模式还是以二进制模式打开.

万一你不知道区别:在默认模式 - 文本模式 - 在某些平台上,某些字符在阅读过程中会以各种方式被翻译.最着名的是,在Windows上,新行在\r\n写入文件时会被翻译,并在读取时以其他方式翻译.换句话说,如果文件包含Hello\r\nWorld,则将其读作Hello\nWorld; 文件大小为12个字符,字符串大小为11.鲜为人知的是 0x1A(或Ctrl-Z)被解释为文件的结尾,因此如果文件包含Hello\x1AWorld,则将其读作Hello.此外,如果内存中的字符串是,Hello\x1AWorld …

c stream file-read undefined-behavior

7
推荐指数
1
解决办法
964
查看次数

标签 统计

c ×2

file ×1

file-read ×1

filesize ×1

io ×1

stream ×1

undefined-behavior ×1