将文件的全部内容读取到c char*,包括新行



我正在寻找一种跨平台(Windows+Linux)的解决方案,可以将整个文件的内容读取到char *中。

这就是我现在拥有的:

FILE *stream;
char *contents;
fileSize = 0;
//Open the stream
stream = fopen(argv[1], "r");
//Steak to the end of the file to determine the file size
fseek(stream, 0L, SEEK_END);
fileSize = ftell(stream);
fseek(stream, 0L, SEEK_SET);
//Allocate enough memory (should I add 1 for the ?)
contents = (char *)malloc(fileSize);
//Read the file 
fscanf(stream, "%s", contents);     
//Print it again for debugging
printf("Read %sn", contents);

不幸的是,这只会打印文件中的第一行,所以我假设fscanf会在第一个换行符处停止。但是,我想阅读整个文件,包括并保留换行符。我不想使用while循环和realloc来手动构建整个字符串,我的意思是必须有一种更简单的方法?

可能是这样的东西?

FILE *stream;
char *contents;
fileSize = 0;
//Open the stream. Note "b" to avoid DOS/UNIX new line conversion.
stream = fopen(argv[1], "rb");
//Seek to the end of the file to determine the file size
fseek(stream, 0L, SEEK_END);
fileSize = ftell(stream);
fseek(stream, 0L, SEEK_SET);
//Allocate enough memory (add 1 for the , since fread won't add it)
contents = malloc(fileSize+1);
//Read the file 
size_t size=fread(contents,1,fileSize,stream);
contents[size]=0; // Add terminating zero.
//Print it again for debugging
printf("Read %sn", contents);
//Close the file
fclose(stream);
free(contents);

函数fread将从流中读取,而不会终止于行尾字符。

man页面,您有:

size_t fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);

其在大小nitems中读取。

fread按原样读取所有文件:

 if (fread(contents, 1, fileSize, stream) != fileSize) {
    /* error occurred */
 }

我有这个:

ssize_t filetomem(const char *filename, uint8_t **result)
{ 
    ssize_t size = 0;
    FILE *f = fopen(filename, "r");
    if (f == NULL) 
    { 
        *result = NULL;
        return -1;
    } 
    fseek(f, 0, SEEK_END);
    size = ftell(f);
    fseek(f, 0, SEEK_SET);
    *result = malloc(size);
    if (size != fread(*result, sizeof(**result), size, f)) 
    { 
        free(*result);
        return -2;
    } 
    fclose(f);
    return size;
}

返回值的含义:

  • 正或0:成功读取文件
  • 减号一:无法打开文件(可能没有这样的文件)
  • 减去二:fread()失败

最新更新