首页 > 编程笔记 > C语言笔记 阅读:17

C语言读取文件(fscanf()、fgetc()和fgets())

在 C语言中,我们可以使用多种函数来读取文件内容。

C语言fscanf()函数

在 C语言中,fscanf() 是一个用于从文件中读取格式化输入的库函数,该函数在<stdio.h>头文件中。

与 scanf() 函数类似,fscanf() 函数根据格式字符串从文件中读取数据,并将读取的数据存储到指定的变量中。不同之处在于,fscanf() 函数从一个 FILE 指针指向的文件中读取数据,而不是从标准输入(如键盘)中读取数据。

fscanf()函数的原型如下:
int fscanf() (FILE * stream, const char * format, ...);
参数说明:
下面程序展示了如何使用 fscanf() 函数从文件中读取数据。在这个例子中,我们以只读模式 "r" 打开文件。
#include <stdio.h>
int main()
{
    FILE* pFile = fopen("data.txt", "r");
    if (pFile == NULL)
    {
        return -1;
    }
    int n;
    double f;
    char ch;
    fscanf(pFile, "%d", &n);
    fscanf(pFile, "%lf", &f);
    fscanf(pFile, "%c", &ch);
    printf("%d\n", n);
    printf("%f\n", f);
    printf("%c\n", ch);
    fclose(pFile);
    return 0;
}
假设 data.txt 存储的内容为:

123
3.141500
A

程序的运行结果为:

123
3.141500

fscanf() 函数成功地从文件中读取了前两个数据,但未能正确读取第三个数据。这是因为第三个 fscanf() 函数中的 %c 占位符期望获取一个字符,而上一行末尾正好有一个换行符 '\n'。因此,第三个 fscanf() 函数实际上读取了 '\n' 并赋值给了变量 ch。

为了解决这个问题,我们可以使用类似于 getchar() 函数的 fgetc() 函数,从文件中读取一个字符并吸收这个换行符 '\n'。

C语言fgetc()函数

在 C语言中,fgetc() 是一个用于从文件中读取单个字符的库函数,该函数在<stdio.h>头文件中。

fgetc() 函数从一个 FILE 指针指向的文件中读取一个字符,并返回该字符的 ASCII 码,如果到达文件末尾或遇到读取错误,则返回 EOF(end of file)。

fgetc() 函数的原型如下:
int fgetc (FILE * stream);
参数 stream 是一个指向 FILE 类型的指针,指示要从中读取字符的文件。fopen() 函数通常用于打开文件并获取此指针。

返回值:
现在,我们使用 fgetc() 函数吸收换行符'\n',从而对前面实例的代码进行修改:
#include <stdio.h>
int main()
{
    FILE* pFile = fopen("data.txt", "r");
    if (pFile == NULL)
    {
        return -1;
    }
    int n;
    double f;
    char ch;
    fscanf(pFile, "%d", &n);
    fscanf(pFile, "%lf", &f);
    // 吸收上一行末尾的'\n'
    fgetc(pFile);
    fscanf(pFile, "%c", &ch);
    printf("%d\n", n);
    printf("%f\n", f);
    printf("%c\n", ch);
    fclose(pFile);
    return 0;
}
运行结果为:

123
3.141500
A

文件中的三个数值均被正确地读取了。

接下来,我们讨论 fgetc() 函数在遇到文件结尾或失败时返回的 EOF。EOF 是一个表示文件结束的标识符,在 C语言中,它通常被定义为一个整数常量 -1,并被包含在<stdio.h>头文件中。

当使用文件 I/O 函数(如 fgetc()、fscanf() 等)读取文件时,如果到达文件末尾或遇到读取错误,这些函数会返回 EOF 值,以便程序员判断文件是否已经读取完毕。

例如,在使用 fgetc() 函数逐字符读取文件时,我们可以通过检查该函数返回值是否为 EOF 来判断文件是否已经读取完毕。
int ch;
while ((ch = fgetc(file)) != EOF) {
    // 处理读取到的字符
}
在这个示例中,当 fgetc() 函数返回 EOF 时,while 循环结束,表示文件已经被完全读取。

C语言fgets()函数

在 C语言中,fgets() 是一个用于从文件中读取一行字符串的库函数,该函数在<stdio.h>头文件中。

fgets() 函数从一个 FILE 指针指向的文件中读取一行字符串(包括换行符),并将读取的字符串存储到指定的字符数组中。当到达指定的最大字符数或遇到文件末尾时,读取操作会停止。

fgets() 函数的原型如下:
char * fgets (char * str, int count, FILE * stream);
参数说明:
例如,我们先声明一个具有 100 字节的 char 类型数组,数组名为 str,用于存储从文件中读取的一行字符串。如果文件中的一行字符串超过 100 个字符,将这一行字符串放置到 str 数组中将导致越界。因此,我们可以使用第二个参数 count 来限制读取的最大字符数。
char buffer[100];
fgets(buffer, 100, pFile);
返回值:
下面程序是一个使用 fgets() 函数的示例。在运行程序之前,需要确保文件中有内容。
#include <stdio.h>
int main()
{
    FILE* pFile = fopen("data.txt", "r");
    if (pFile == NULL)
    {
        return -1;
    }
    char buffer[100];
    while (fgets(buffer, 100, pFile) != NULL)
    {
        printf("%s", buffer);
    }
    fclose(pFile);
    return 0;
}
运行结果为:

123
3.141500
A

相关文章