繁体   English   中英

如何从c中的文件读取一行?

[英]How do I read a line from a file in c?

我需要通过ac程序逐行读取文件。 我知道我可以通过使用FILE指针和使用fgets (如果按固定长度的字符串)或fgetc (如果按字符一个字符)来非常直接地做到这一点。 这里要注意的唯一一点是文件中一行的长度可以不同。 所以,如果我正在使用

char *fgets(char *__restrict s, int n, FILE *__restrict stream); 

我在这里不知道“ int n”的值,因为它在文件中的每一行都可能不同。

我搜索了此查询的答案,但我知道了getline函数(即c ++函数)的用法。 对我而言,唯一的方法是读取每个字符,直到遇到“ \\ n”并将其复制到字符串中。

在交流程序中还有其他方法可以直接做到这一点吗?

检查此-> 说明 (可能重复的问题)记录了getline函数-> 此处

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

int
main(void)
{
    FILE *fp;
    char *line = NULL;
    size_t len = 0;
    ssize_t myread;

   fp = fopen("/etc/motd", "r");
    if (fp == NULL)
        exit(EXIT_FAILURE);

   while ((myread = getline(&line, &len, fp)) != -1) {
        printf("Retrieved line of length %zu :\n", myread);
        printf("%s", line);
    }

   free(line);
    exit(EXIT_SUCCESS);
}

我在这里不知道“ int n”的值,因为它在文件中的每一行都可能不同。

上面的讨论和其他讨论都暗示OP希望代码能够自动将缓冲区的大小调整为任意行长。 如果您愿意接受最大长度,则fgets()可以很好地完成工作。 阅读该行,然后复制到合适大小的缓冲区中。

  #define BUF_SIZE 1000
  char buf[BUF_SIZE];

  while (fgets(buf, sizeof buf, stream)) {

    // Add long line detection here if desired

    char *s = strdup(buf);
    foo(s);
  }

如果代码不想强加任何最大长度,IMO,这是一个较弱的设计。 当然,行可以很长, BUF_SIZE上面的BUF_SIZE应该是一个非常大的值,但是允许代码处理任意长度的行是将程序的控制权交给外力,无论是文件还是用户输入。 这是黑客利用的基础。 给定的应用程序应具有可接受的行长的自由上限。 fgets()提供了-尽管它确实还有其他弱点。 通用的* nix getline()允许外力使您的程序在一次调用中消耗多达SIZE_MAX个字节,而不是防御性代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM