2012-08-03 95 views
1

我正在寻找跨平台(Windows + Linux)解决方案将整个文件的内容读取到char *将文件的全部内容读取到c 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 \0?) 
contents = (char *)malloc(fileSize); 

//Read the file 
fscanf(stream, "%s", contents);  

//Print it again for debugging 
printf("Read %s\n", contents); 

不幸的是这将只打印文件中的第一行,所以我假设的fscanf停在第一个换行符。不过,我想阅读整个文件,包括并保留新的行字符。我宁愿不使用while循环并重新分配手动构造整个字符串,我的意思是必须有一个更简单的方法?

回答

2

这样的事情,可能是什么?

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 \0, 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 %s\n", contents); 

//Close the file 
fclose(stream); 
free(contents); 
+0

完美地工作,请注意,由于您已经拥有fileSize,因此您不需要size_t大小。接受最清楚的解释! – 2012-08-03 10:29:31

+0

你确实需要size_t的大小,因为你不需要读取你询问的任何数量的字节(无论什么原因)。并且你的分配的缓冲区将不需要除了读满零之外的任何东西......并且我们真的不想打印垃圾:它在Windows上结束很糟糕,并且可以在UNIX上对终端执行讨厌的事情。 – Senna 2012-08-03 10:33:19

+0

啊我不知道,我修改了我的代码。 – 2012-08-03 10:35:47

0

函数fread将从流中读取,不会终止在行结束字符处。

man页面,您有:

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

其读取NITEMS大小大小

0

fread读取所有的文件原样:

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

我有这样的:

  • 正或0:

    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; 
    } 
    

    返回值的含义成功读取文件

  • 减一:无法打开文件(可能没有这样的文件)
  • 减二:FREAD()失败