【问题标题】:How to fgets() a specific line from a file in C?如何 fgets() C 中文件中的特定行?
【发布时间】:2011-11-17 22:14:37
【问题描述】:

所以,我正在尝试找到一种方法来 fgets() C 中文本文件中的特定行,以将该行的内容复制到更永久的缓冲区中:

基本上,我想知道是否有一种方法可以在没有类似于以下代码的情况下做到这一点:

FILE *fp;
fp = fopen(filename, "r");

char line[256];
char * buffer;
int targetline = 10;
while( targetline > 0)
{
    fgets(line, 256, fp)
}

buffer =(char*)malloc(sizeof(char) * strlen(line));
strcpy(buffer, line);

所以基本上我不想为了到达第 n 行而遍历文件 n-1 次......它似乎效率不高(而且,这是家庭作业,我需要得到 100 %哈哈)。

任何帮助将不胜感激。

【问题讨论】:

  • 如果您的行可以有任意长度,您如何期望在恒定时间内跳过n 行?
  • 唯一真正的替代方法是建立每行开始位置的索引(读取文件一次,建立索引,然后使用它直接查找一行,直到/除非文件更改)。另请注意,您的 malloc 需要加 1 为 NUL 终止符留出空间。
  • 一些存储文本文件的机制可能提供了一种在恒定时间内访问第 N 行的方法,或者至少比线性时间更好。 VMS 上使用的一些文件格式可能会这样做。但是 C 标准库没有公开任何此类机制,并且在大多数操作系统上,纯文本文件甚至都不可能,除非您自己构建索引。所以这不是一个不合理的问题——但答案是否定的。

标签: c filestream fgets


【解决方案1】:

除非您对文件有更多了解,否则您无法随意访问特定行。新行由行尾字符分隔,通常可以出现在任何地方。文本文件不附带 mapindex,可让您跳到第 nth 行。

如果您知道文件中的每一行都是相同的长度,那么您可以使用随机访问来跳转到特定的行。如果没有这种额外的知识,您就别无选择,只能遍历整个文件,直到到达您想要的行。

【讨论】:

    【解决方案2】:

    如果你知道每一行的长度,你可以使用 fseek 跳到你想要的那一行。

    否则,你需要遍历所有行。

    【讨论】:

      【解决方案3】:

      首先,你的线

      buffer =(char*)malloc(sizeof(char) * strlen(line));
      

      最好写成:

      buffer = malloc(strlen(line) + 1);
      

      + 1 需要为终止字符“\0”提供空间; strlen() 不考虑这一点。没有必要在 C 中强制转换 malloc() 的结果,并且在某些情况下可以掩盖错误。 sizeof(char) 根据定义为 1,因此不需要。

      而且你永远不会改变targetline 的值,所以你的循环永远不会终止。

      但在回答您的问题时,如果您有一个文本文件并且您想阅读它的第 N 行,您必须阅读并跳过前 N-1 行才能找到它。 (可以设置一个单独的索引,但是创建索引无论如何都需要通读文件,并且在文件更改时保持索引最新是一个难题,可能超出了您现在正在做的事情。而且这不是特别必要;从文件中读取 10 行的时间不会很明显。)

      【讨论】:

        【解决方案4】:

        恐怕没有其他方法可以获取文件中的第 n 行。你必须通过。文件中没有随机访问。

        【讨论】:

          【解决方案5】:

          如果你想从一个文本文件中获取第 n 行,你必须阅读它之前的 n-1 行。这就是顺序文件的本质。除非您知道所有行的长度相同,否则无法可靠地定位到特定行的开头。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-08-19
            • 2021-09-13
            • 1970-01-01
            • 2014-05-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多