【问题标题】:Read multiples lines from file to a string in C从文件读取多行到C中的字符串
【发布时间】:2010-07-13 01:49:04
【问题描述】:

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

编辑:我想我将获取字符串并将它们存储在一个灵活的缓冲区中(通过 realloc):) 另外,这不是家庭作业,即使看起来似乎是这样(编程对我来说只是一种爱好) .我只是出于好奇而问

【问题讨论】:

  • 这是作业吗?您是否尝试过任何可以向我们展示的东西?你有更多细节要分享吗?
  • 不,这不是家庭作业;只是玩得开心(我的研究是在医疗保健领域,哈哈)我想用 fgets 读取字符串,然后将它们组合成一个最终的字符串,但只是想知道是否有更有效的方法来做到这一点。无论如何,我会尝试它,同时仍在阅读可能的回复:)

标签: c string


【解决方案1】:

因为这显然不是家庭作业,所以这里有一些我将如何做的示例代码。我只是为整个文件分配了一大块内存,因为无论如何你最终都会读取整个文件,但是如果你正在处理大文件,通常最好一次处理一行。

#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 代码了。希望人们能够对大量问题进行有用的更正/通知。 :)

【讨论】:

  • 这是一个有趣的解决方案......你刚刚给了我一个想法。在我的文件中,我有一些分隔符......我可以预先扫描文件并构建一个分隔符列表,然后使用所述列表再次运行它以分配内存(两个分隔符的位置差异是它们之间的字符串的大小)。谢谢!
  • fstat 获取文件长度而不是fseek + ftell + fseek 怎么样?
【解决方案2】:

这是一般流程

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

【讨论】:

  • 这就是我的想法......我只是问,因为可能有一些我不知道的抽象。还是谢谢
  • string.h 中有一些额外的字符串方法,但没有直接适用于您的问题。如果你想用 C 编程,你必须习惯自己做这种事情。
【解决方案3】:

这是作业吗? 这里的棘手之处在于您必须跟踪字符串长度以及它有多少已使用/为空。 要么猜得足够高,要么在空间不足时致电malloc() 或其兄弟之一。

【讨论】:

  • 这个作业经常吗? :\ 无论如何,我会用 malloc 和 realloc 来做。
【解决方案4】:

您可以在这里尝试“可变长度”字符串的实现:

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

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

【讨论】:

  • 我过去已经实现了一个可变长度的字符串类型,所以我将使用那个,但无论如何感谢 Baltasarq :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多