我试图将文件一次性读入一个字符串,但是我只能用这段代码逐行读取它:
int main()
{
char input[1000000];
FILE *fPointer;
fPointer = fopen("/Users/boys/users.json", "r");
if( fPointer != NULL)
{
while(!feof(fPointer))
{
fgets(input, 1000000, fPointer);
//printf("%s", input);
}
}
printf("%s", input);
return 0;
}
我正在处理一个json文件,并且过去只使用csv和更简单的文件,因为我还是很新的并且不是那么好所以如果有人有一个简单的解决方案来读取所有的文件一次而不是一行一行,这将是一个很大的帮助,谢谢!
答案 0 :(得分:3)
fgets()
函数读取,直到达到EOF / NewLine /指定大小。所以它的功能不正确,因为如果文件包含多行,你可以读取最多一行。
这里有一种可能的方法
首先,你必须找出文件
中内容的大小(以字节为单位)fseek(fPointer, 0L, SEEK_END);
long numOfBytes = ftell(fPointer);
为此数据量动态分配缓冲区足够大。 (自c99起,您可以使用VLA)
char *ptr = calloc(numOfBytes+1, 1);
if (ptr == NULL) // Failed to allocate memory
{ perror("calloc"); exit(EXIT_FAILURE); };
将指标的位置重置到文件的开头(或重新打开文件)
fseek(fPointer, 0L, SEEK_SET); // Or use rewind
现在,您可以使用fread
阅读整个文件内容。
fread(ptr, sizeof(char), numOfBytes, fPointer);
并清理
free(ptr);
fclose(fPointer);
答案 1 :(得分:1)
来自man fgets
:
fgets()从流中读取最多一个小于大小的字符,并将它们存储到s指向的缓冲区中。读数在EOF或换行符后停止。如果读取换行符,则将其存储到缓冲区中。终止空字节('\ 0')存储在缓冲区中的最后一个字符之后。
您可以使用fread
来实现您的目标。
答案 2 :(得分:1)
FILE *fPointer = fopen("/Users/boys/users.json", "r");
)。fseek(fPointer , 0, SEEK_END);
)。 PS:通过fread()
读取文件不会形成字符串,因为它可能缺少空字符(但您可以自己插入它)。
答案 3 :(得分:0)
在符合POSIX标准的系统上:
int fd = open( filename, O_RDONLY );
struct stat sb;
fstat( fd, sb );
// by adding one, data can possibly be
// treated as a string, assuming no NULs
// exist in the file's contents
char *data = calloc( sb.st_size + 1, 1 );
size_t totalRead = 0;
while ( totalRead < sb.st_size )
{
ssize_t bytesRead = read( fd, &( data[ totalRead ] ), sb.st_size - totalRead );
if ( bytesRead <= 0 )
{
break;
}
totalRead += bytesRead;
}
我使用calloc()
创建一个零填充缓冲区,而不是将最后一个字节显式设置为NUL
。这使得实际处理更容易看到和理解。
我也因为同样的原因而遗漏了错误检查。