【发布时间】:2011-04-14 09:49:06
【问题描述】:
我想将文本文件的内容读入 C 中的 char 数组。必须保留换行符。
我该如何做到这一点?我在网上找到了一些 C++ 解决方案,但没有找到纯 C 的解决方案。
编辑:我现在有以下代码:
void *loadfile(char *file, int *size)
{
FILE *fp;
long lSize;
char *buffer;
fp = fopen ( file , "rb" );
if( !fp ) perror(file),exit(1);
fseek( fp , 0L , SEEK_END);
lSize = ftell( fp );
rewind( fp );
/* allocate memory for entire content */
buffer = calloc( 1, lSize+1 );
if( !buffer ) fclose(fp),fputs("memory alloc fails",stderr),exit(1);
/* copy the file into the buffer */
if( 1!=fread( buffer , lSize, 1 , fp) )
fclose(fp),free(buffer),fputs("entire read fails",stderr),exit(1);
/* do your work here, buffer is a string contains the whole text */
size = (int *)lSize;
fclose(fp);
return buffer;
}
我收到一个警告:警告:赋值使指针从整数而不进行强制转换。这是在线size = (int)lSize;。如果我运行该应用程序,它会出现段错误。
更新: 上面的代码现在可以工作了。我找到了段错误,并发布了另一个问题。感谢您的帮助。
【问题讨论】:
-
使用 fseek() 来获取文件的大小,限制你只读取真实的磁盘文件。使用它意味着您不能从管道(如标准输入)、命名管道、设备或网络流中读取数据。查看上面评论中的链接Easiest way to get file's contents in C
-
请不要将答案编辑成问题。如果您想要一个完善的版本,请发布您自己的答案。这有像
size = (int *)lSize;这样的错误,它将指针局部变量size设置为一个整数转换为指针,但没有做任何事情来更新调用者传递一个指针的int。 (可能你的意思是*size = lSize)。所以这个错误的答案应该被否决,但这是一个合理的问题。另外,您提到您发现(并修复了?)一个段错误,但这是旧代码还是固定代码?无论如何,即使可以复制/粘贴也不应该出现在 Q 中