读取文件中的多个行到C中的字符串

时间:2010-07-13 01:49:04

标签: c string

如何从文本文件中读取多行(可变宽度)并将所有行存储在C“字符串”中?

编辑:我想我会把字符串存储起来并将它们存储在一个灵活的缓冲区中(通过realloc):)此外,这不是功课,即使它看起来似乎如此(编程只是我的一个爱好) 。我只是出于好奇而

4 个答案:

答案 0 :(得分:2)

由于这显然不是家庭作业,这里有一些示例代码,说明我是如何做的。我只是为整个文件分配了一个巨大的内存块,因为你最终还是要阅读整个文件,但是如果你处理大文件,通常最好一次处理一行。 / p>

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

int main(int argc, char *argv[])
{
        // first, get the name of the file as an argument
        if (argc != 2) {
                printf("SYNTAX: %s <input file>\n", argv[0]);
                return -1;
        }

        // open the file
        FILE* fp = fopen(argv[1], "r");

        if (fp == NULL) {
                printf("ERROR: couldn't open file\n");
                return -2;
        }

        // seek to the end to get the length
        // you may want to do some error-checking here
        fseek(fp, 0, SEEK_END);
        long length = ftell(fp);

        // we need to seek back to the start so we can read from it
        fseek(fp, 0, SEEK_SET);

        // allocate a block of memory for this thing
        // the +1 is for the nul-terminator
        char* buffer = malloc((length + 1) * sizeof(char));

        if (buffer == NULL) {
                printf("ERROR: not enough memory to read file\n");
                return -3;
        }

        // now for the meat. read in the file chunk by chunk till we're done
        long offset = 0;
        while (!feof(fp) && offset < length) {
                printf("reading from offset %d...\n", offset);
                offset += fread(buffer + offset, sizeof(char), length-offset, fp);
        }

        // buffer now contains your file
        // but if we're going to print it, we should nul-terminate it
        buffer[offset] = '\0';
        printf("%s", buffer);

        // always close your file pointer
        fclose(fp);

        return 0;
}

哇,自从我编写C代码以来已经有一段时间了。希望人们会对大量问题提供有用的更正/通知。 :)

答案 1 :(得分:1)

这是一般过程

  1. 创建初始缓冲区。
  2. 从文件中读取一行,或者直到缓冲区中的剩余空格。
  3. EOF?跳到6。
  4. 填充缓冲区?重新分配更多空间。
  5. 冲洗并重复。
  6. 添加终止0

答案 2 :(得分:0)

这是家庭作业吗? 这里棘手的是你必须跟踪字符串的长度以及使用/清空的长度。 要么猜得足够高就可以开始,或者在你没有太空的时候打电话给malloc()或其中一个兄弟。

答案 3 :(得分:0)

您可以在此处尝试“可变长度”字符串实现:

How to implement a variable-length ‘string’-y in C

然后,您必须对字符串编写“添加”操作。然后,您可以安全地读取任何字节块,并将其连接到您已阅读的内容。