在不知道行长度的情况下从文件读取行

ryy*_*yst 27 c file-io

我想逐行读取文件,而不知道以前的行长度.这是我到目前为止所得到的:

int ch = getc(file);
int length = 0;
char buffer[4095];

while (ch != '\n' && ch != EOF) {
    ch = getc(file);
    buffer[length] = ch;
    length++;
}

printf("Line length: %d characters.", length);

char newbuffer[length + 1];

for (int i = 0; i < length; i++)
    newbuffer[i] = buffer[i];

newbuffer[length] = '\0';    // newbuffer now contains the line.
Run Code Online (Sandbox Code Playgroud)

我现在可以计算出行长度,但仅适用于短于4095个字符的行,加上两个char数组似乎是执行任务的一种尴尬方式.有没有更好的方法来做到这一点(我已经使用了fgets(),但被告知它不是最好的方式)?

--Ry

cod*_*ict 15

您可以从您选择的一些合适尺寸开始,然后realloc如果您需要更多空间,请在中途使用:

int CUR_MAX = 4095;
char *buffer = (char*) malloc(sizeof(char) * CUR_MAX); // allocate buffer.
int length = 0;

while ( (ch != '\n') && (ch != EOF) ) {
    if(length ==CUR_MAX) { // time to expand ?
      CUR_MAX *= 2; // expand to double the current size of anything similar.
      buffer = realloc(buffer, CUR_MAX); // re allocate memory.
    }
    ch = getc(file); // read from stream.
    buffer[length] = ch; // stuff in buffer.
    length++;
}
.
.
free(buffer);
Run Code Online (Sandbox Code Playgroud)

调用malloc和后,您必须检查分配错误realloc.

  • @Blindy:标准库I/O执行缓冲,因此这不比(读取)块慢得多. (6认同)
  • 不将count重置为0会导致缓冲区溢出? (2认同)
  • 一如既往,请[不要强制转换`malloc()`的结果](http://stackoverflow.com/a/605858/3233393)。 (2认同)

jam*_*lin 5

您可能想查看Chuck B. Falconer的公共域ggets.如果你在使用glibc的系统上,你可能有一个(非标准)getline功能.