📜  C |文件处理|问题5(1)

📅  最后修改于: 2023-12-03 14:59:38.631000             🧑  作者: Mango

C 文件处理 问题5

当处理文件时,有时我们需要读取文件中的一行文本。在 C 语言中有多种方法可以实现这个功能,本文将介绍其中两种常用的方法。

方法1:使用 fgets 函数

C 语言提供了 fgets 函数用于读取文件中的一行文本。其函数原型如下:

char* fgets(char* str, int num, FILE* stream);

该函数从指定的流 stream 中读取最多 num - 1 个字符,并将它们存储在 str 所指向的字符数组中。函数会在以下情况停止读取:

  • 读到换行符('\n')时停止;
  • 已经读取了 num - 1 个字符时停止(最后一个字符会被置为 null);
  • 出错时停止,返回 NULL。

示例代码:

#include <stdio.h>

int main() {
    FILE* fp = fopen("example.txt", "r");
    if (fp == NULL) {
        printf("文件打开失败");
        return 1;
    }

    char buf[1024];
    while (fgets(buf, 1024, fp) != NULL) {
        printf("%s", buf);
    }

    fclose(fp);
    return 0;
}
方法2:使用 getline 函数

C 语言的 GNU 版本(GCC)提供了一个名为 getline 的函数,该函数可以通过动态分配内存来读取任意长度的一行文本。其函数原型如下:

ssize_t getline(char** lineptr, size_t* n, FILE* stream);

该函数从指定的流 stream 中读取一行文本,并将其存储在指针 lineptr 指向的字符数组中。如果 lineptr 指向的数组太小,函数会为其分配足够的内存(内存大小存储在指针 n 指向的变量中)。函数成功时返回读取的字符数(不包含 null 终止符),失败时返回 -1。

示例代码:

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

int main() {
    FILE* fp = fopen("example.txt", "r");
    if (fp == NULL) {
        printf("文件打开失败");
        return 1;
    }

    char* buf = NULL;
    size_t len = 0;
    ssize_t nread;
    while ((nread = getline(&buf, &len, fp)) != -1) {
        printf("%s", buf);
    }

    free(buf);
    fclose(fp);
    return 0;
}

结论

以上两种方法都可以用来读取文件中的一行文本,具体使用哪种方法取决于应用场景和个人喜好。fgets 的使用更加简单,但是不能读取任意长度的一行文本。getline 的使用稍微复杂一些,但是可以读取任意长度的一行文本。