簡體   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