一次读取文件而不是逐行读取(在c中)

时间:2017-08-29 11:16:46

标签: c arrays string file

我试图将文件一次性读入一个字符串,但是我只能用这段代码逐行读取它:

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和更简单的文件,因为我还是很新的并且不是那么好所以如果有人有一个简单的解决方案来读取所有的文件一次而不是一行一行,这将是一个很大的帮助,谢谢!

4 个答案:

答案 0 :(得分:3)

fgets()函数读取,直到达到EOF / NewLine /指定大小。所以它的功能不正确,因为如果文件包含多行,你可以读取最多一行。

这里有一种可能的方法

首先,你必须找出文件

中内容的大小(以字节为单位)
fseek(fPointer, 0L, SEEK_END);
long numOfBytes = ftell(fPointer);

为此数据量动态分配缓冲区足够大。 (自起,您可以使用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)

  1. 打开文件(FILE *fPointer = fopen("/Users/boys/users.json", "r");)。
  2. 找到它(fseek(fPointer , 0, SEEK_END);)。
  3. 获取文件位置(等于大小)。
  4. 倒回文件位置。
  5. 分配所需的内存。
  6. 将文件读入已分配的内存。
  7. 使用字符串。
  8. 完成后取消分配内存。
  9. 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。这使得实际处理更容易看到和理解。

我也因为同样的原因而遗漏了错误检查。