0

我想将文件的数据读入字符串。

是否有将整个文件读入字符数组的函数?我这样打开文件:

FILE *fp;

for(i = 0; i < filesToRead; i++)
{
  fp = fopen(name, "r");

  // Read into a char array.  
}

编辑:那么如何“逐行”阅读 getchar() ?

4

3 回答 3

2

以下是将整个文件读入连续缓冲区的三种方法:

  1. 找出文件长度,然后找出fread()整个文件。fseek()您可以使用and计算长度ftell(),也可以fstat()在 POSIX 系统上使用。这不适用于套接字或管道,它仅适用于常规文件。

  2. 将文件读入一个缓冲区,当您使用fread(). 典型的实现以“合理的”缓冲区大小开始,每次空间耗尽时将其翻倍。这适用于任何类型的文件。

  3. 在 POSIX 上,使用fstat()获取文件,然后mmap()将整个文件放入您的地址空间。这仅适用于常规文件。

于 2013-10-11T21:54:29.643 回答
0

您可以执行以下操作:

FILE *fp;
int currentBufferSize;

for(i = 0; i < filesToRead; i++)
{
  fp = fopen(name, "r");
  currentBufferSize = 0;
  while(fp != EOF)
     fgets(filestring[i], BUFFER_SIZE, fp); 

}

当然,您必须以更强大的方式进行此操作,检查您的缓冲区是否可以保存所有数据等等......

于 2013-10-11T21:59:04.580 回答
0

您可能会使用类似以下的内容:阅读每一行,仔细检查结果并将其传递给您选择的数据结构。我没有展示如何正确分配内存,但您可以在必要时malloc提前。realloc

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#define FILE_BUFFER_SIZE 1024

int file_read_line(FILE *fp, char *buffer)
{
    // Read the line to buffer
    if (fgets(buffer, FILE_BUFFER_SIZE, fp) == NULL)
        return -errno;

    // Check for End of File
    if (feof(fp))
        return 0;

    return 1;
}

void file_read(FILE *fp)
{
    int read;
    char buffer[FILE_BUFFER_SIZE];

    while (1) {

        // Clear buffer for next line
        buffer[0] = '\0';

        // Read the next line with the appropriate read function
        read = file_read_line(fp, buffer);

        // file_read_line() returns only negative numbers when an error ocurred
        if (read < 0) {
            print_fatal_error("failed to read line: %s (%u)\n", 
                strerror(errno), errno);
            exit(EXIT_FAILURE);
        }

        // Pass the read line `buffer` to whatever you want

        // End of File reached
        if (read == 0)
            break;
    }

    return;
}
于 2013-10-11T21:59:09.423 回答