[英]How do I put each line in an array which read from the file in c program?
[英]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.