大话C语言:第45篇 文件操作

文件操作需要经过以下几个步骤:

  • 文件打开:C语言中,使用fopen函数来打开文件。该函数接受两个参数:文件路径和打开模式(如"r"表示只读,"w"表示写入,"a"表示追加等)。如果文件打开成功,fopen返回一个非空的文件指针;否则返回NULL。

  • 文件读写:C语言提供了多种函数用于文件的读写操作,如fgetcfgets用于从文件中读取字符或字符串,fputcfputs用于向文件中写入字符或字符串。此外,还有freadfwrite函数用于读写二进制数据。

  • 文件定位:C语言中的fseek函数用于移动文件位置指针到指定位置,从而实现对文件的定位。通过定位,程序可以从文件的任意位置开始读写数据。

  • 文件关闭:使用完文件后,应该使用fclose函数关闭文件。关闭文件可以释放系统资源,确保数据的完整性。

1 文件打开

fopen是C语言标准库中的一个函数,用于打开文件,并返回一个指向该文件的指针,这个指针被称为文件指针。语法格式:

FILE *fopen(const char *filename, const char *mode);
功能:打开一个已经存在的文件,并返回这个文件的文件指针(文件的标识)或者创建一个文件,并打开此文件,然后返回文件的标识。
参数:
    filename:要打开的文件名(可以包含路径)。
	mode:打开文件的方式,也就是文件访问模式。
返回值:
    成功时,返回一个非空的FILE指针
    失败时,返回NULL
其中,mode参数指定了文件应如何打开,它可以是以下值之一或它们的组合:
    "r":以只读方式打开文件。文件必须存在。
    "w":以写入方式打开文件。如果文件存在,则清空文件内容;如果文件不存在,则创建新文件。
    "a":以追加方式打开文件。如果文件存在,写入的数据会被加到文件尾;如果文件不存在,则创建新文件。
    "r+":以读写方式打开文件。文件必须存在。
    "w+":以读写方式打开文件。如果文件存在,则清空文件内容;如果文件不存在,则创建新文件。
    "a+":以读写方式打开文件。如果文件存在,写入的数据会被加到文件尾;如果文件不存在,则创建新文件。
此外,为了支持二进制文件的打开,还可以在上述模式字符串中添加一个b字符,例如"rb"表示以二进制方式只读打开文件

2 文件关闭

fclose是用于关闭一个先前由fopen或类似函数打开的文件。语法格式:

int fclose(FILE *fp);
功能:关闭fp所代表的文件
参数:
    fp:这是一个指向FILE类型结构的指针,指向要关闭的目标文件。这个指针通常是由fopen函数返回的。
返回值:
    如果文件成功关闭,fclose函数返回0。
	如果关闭文件失败,fclose函数返回EOF(通常是-1)。如果传递给fclose的指针是NULL,并且程序可以继续执行,fclose将设定错误码为EINVAL,并返回EOF

代码示例:

#include <stdio.h>

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

    // 关闭文件
    if (fclose(fp) != 0) 
    {  
        printf("关闭文件失败\n");
        
        return 1;  
    }
    else
    {
        printf("关闭文件成功\n");
    }
    
    return 0;
}

注意,使用fclose时,应当总是检查其返回值以确保文件已经正确关闭。未正确关闭文件可能导致数据丢失或资源泄漏。在调用fclose之前,通常建议先清空文件缓冲区,以确保所有数据都被写入文件。

3 文件读取

3.1 读取一个字符

fgetc 是 C 语言标准库中的一个函数,用于从指定的文件流中读取一个字符。语法格式:

int fgetc(FILE *stream);
功能:从指定的文件流中读取一个字符。
参数:
    FILE *stream:这是一个指向 FILE 对象的指针,它表示要从中读取字符的文件流。
返回值:
    如果读取成功,fgetc 返回读取到的字符。
    如果在读取字符时遇到文件结尾(EOF),或者发生错误,fgetc 将返回 EOF。

在使用 fgetc 时,通常需要检查返回值是否为 EOF,以确定是否已到达文件末尾或发生了错误。可以使用 feof(stream) 函数来检查是否到达文件末尾,使用 ferror(stream) 函数来检查是否发生错误。

代码示例:

#include <stdio.h>  
  
int main()
{  
	// 打开文件
    FILE *file = fopen("example.txt", "r");  
    if (file == NULL) 
    {  
        printf("文件打开失败\n");
        
        return 1;  
    }  
  
    int character;  
    // 循环读取文件中字符,直到文件结尾
    while ((character = fgetc(file)) != EOF)
    {  
        // 检查是否为 EOF 之外的错误  
        if (ferror(file)) 
        {  
            printf("文件读取出错\n");  
            break;  
        }  
        // 否则,输出读取到的字符  
        putchar(character);  
    }  
  
    if (feof(file))
    {  
        printf("\n文件读取结束!\n");  
    }  
  
    fclose(file);  
    return 0;  
}

3.2 读取一个字符串

fgets 是 C 语言中的一个标准库函数,用于从指定的文件流中读取一行数据,直到遇到换行符('\n')、文件结束符(EOF)或读取了指定数量的字符为止(不包括末尾的换行符)。语法格式:

char *fgets(char *str, int n, FILE *stream);
功能:从指定的文件流中读取一行数据,直到遇到换行符('\n')、文件结束符(EOF)或读取了指定数量的字符为止(不包括末尾的换行符)。
参数:
    str:这是一个指向字符数组的指针,用于存储从文件中读取的字符串。这个数组必须足够大,以容纳要读取的字符串,包括一个额外的空字符('\0')作为字符串的结束标志。
	n:这是一个整数,指定了最多读取的字符数(包括结尾的空字符)。通常,这个值会设置为字符数组的大小。
	stream:这是一个指向 FILE 对象的指针,它表示要从中读取字符串的文件流。这个 FILE 对象通常是通过 fopen 函数打开的。
返回值:
    如果成功读取一行,fgets 返回指向 str 的指针。
	如果在读取任何字符之前就遇到文件结束符或发生错误,fgets 返回 NULL。

代码示例:

#include <stdio.h>  
  
int main() 
{  
    // 打开文件
    FILE *file = fopen("example.txt", "r");  
    if (file == NULL) {  
        perror("文件打开失败\n");
        
        return 1;  
    }  
  
    char line[100] = {0};
	// 循环读取每一行数据  
    while (fgets(line, sizeof(line), file)) 
    {  
        // 处理读取到的行数据  
        printf("%s", line);  
    }  
  
    // 判断是否读取至文件尾部
    if (feof(file)) 
    {  
        printf("\n文件读取结束!\n");  
    } 
    else if (ferror(file)) 
    {  
        perror("文件读取错误\n");  
    }  
  
    fclose(file);  
    return 0;  
}

注意,

  • fgets 会将读取的字符串(包括末尾的空字符)存储在 str 指向的数组中。如果读取的字符串中包含换行符,它也会被存储在数组中。

  • fgets 会在读取到换行符、EOF 或读取了 n-1 个字符后停止(留一个位置给空字符)。这意味着如果一行中的字符数超过了 n-1fgets 只会读取部分行。

  • 如果需要连续读取多行数据,并且每行数据的长度可能超过 n-1,你需要在一个循环中多次调用 fgets,每次处理完一行数据后再读取下一行。

3.3 读取指定大小数据

fread是C语言标准库中的一个函数,用于从文件中读取数据。它可以将指定数量的数据项从文件中读取到内存中。语法格式:

size_t fread(void *ptr, size_t size, size_t count, FILE *fp);
功能:从fp所标识的文件中读取数据,每块是size个字节,共count块,存放到ptr指向的内存里。
参数:
	ptr:指向要读取数据的缓冲区的指针,即数据保存的地址。
	size:每个数据项的字节数。
	count:要读取的数据项数目。
	fp:指向文件流的指针,即要读取的文件的标识符。
返回值:
	fread函数返回成功读取的数据项个数。如果发生错误或在读取任何数据项之前就已经到达文件末尾,返回值可能小于count

代码示例:

 #include <stdio.h>  
  
int main() 
{  
    // 打开文件
    FILE *fp = fopen("example.txt", "r");
    if (fp == NULL) 
    {  
        printf("文件打开失败\n");  
        return 1;  
    }  
  
    char buffer[100]; // 读取数据的缓冲区  
    // 读取数据
    size_t itemsRead = fread(buffer, sizeof(char), sizeof(buffer), fp);   
    if (itemsRead == 0) 
    {  
        // 判断是否读到文件结尾
        if (feof(fp)) 
        {  
            printf("已经读到文件尾部\n");  
        } 
        else 
        {  
            printf("文件读取出错\n");  
        }  
        fclose(fp);  
        return 1;  
    } 
  
    fclose(fp); // 关闭文件  
    return 0;  
}

注意,

  • fread函数主要用于读取二进制文件,但也可以用于读取文本文件。在读取文本文件时,需要确保正确处理换行符等文本特定的字符。

  • 使用fread时,应当检查返回值以确保正确读取了期望数量的数据项。如果返回值小于count,可能表示文件末尾已经到达,或者发生了其他错误。

4 文件写入

fwrite是C语言标准库中的一个文件操作函数,主要用于将数据写入到文件中。其详细定义如下:

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *fp);
功能:将ptr指向的内存里的数据,向fp所标识的文件中写入数据,每块是size个字节,共count块。
参数:
    ptr:这是一个指向要写入文件的数据的指针。
	size:每个数据元素的大小(以字节为单位)。
	count:要写入的数据元素的数量。
	fp:这是一个指向FILE结构的指针,即目标文件的标识符。
返回值:
    fwrite函数返回成功写入文件的数据项个数。如果发生错误或在写入任何数据项之前就已经到达文件末尾,返回值可能小于count。

代码示例:

#include <stdio.h>  
  
int main() 
{  
    FILE *fp;  
    int data[] = {1, 2, 3, 4, 5};  
    size_t elements = sizeof(data) / sizeof(data[0]);  
  
    // 打开文件以进行二进制写入  
    fp = fopen("example.txt", "w+");  
    if (fp == NULL) {  
        printf("文件打开失败\n");  
        return 1;  
    }  
  
    // 将整数数组写入文件  
    size_t itemsWritten = fwrite(data, sizeof(int), elements, fp);  
    if (itemsWritten != elements) 
    {  
        printf("文件写入失败\n");  
        fclose(fp);  
        return 1;  
    }
  
    // 关闭文件  
    fclose(fp);  
  
    return 0;  
}

5 文件定位

fseek是C语言标准库中的一个函数,用于设置文件指针的位置。语法格式:

int fseek(FILE *stream, long offset, int whence);
功能:移动文件流的读写位置
参数:
    stream:这是一个指向要操作的文件的指针,通常是由fopen函数返回的。
	offset:偏移量,表示以字节为单位的偏移量。正数表示向后移动,负数表示向前移动。
	whence:起始点,指定从哪个位置开始计算偏移量。它可以是以下三个常量之一:
    	SEEK_SET:文件开头。偏移量是从文件起始位置开始计算的。
		SEEK_CUR:文件当前位置。偏移量是从文件当前位置开始计算的。
		SEEK_END:文件末尾。偏移量是从文件末尾开始计算的。
返回值:
    0 执行成功
    非0 执行失败

代码示例:

#include <stdio.h>  
  
int main() 
{  
    // 打开文件  
    FILE *file = fopen("example.txt", "r");
    if (file == NULL)
    {  
        printf("文件打开失败\n");  
        return 1;  
    }  
  
    // 假设我们要将文件指针移动到距离文件开始处10个字节的位置  
    long offset = 10;  
    if (fseek(file, offset, SEEK_SET) != 0) 
    {  
        printf("文件定位失败\n");  
        fclose(file);
        
        return 1;  
    }  
  
    // 从当前位置开始读取内容  
    char buffer[100] = {0};  
    if (fgets(buffer, sizeof(buffer), file) != NULL)
    {  
        printf("文件偏移及后续内容分别是%ld:\n%s", offset, buffer);  
    } 
    else 
    {  
        printf("没有读取到当前位置后续内容.\n");  
    }  
  
    // 关闭文件  
    fclose(file);  
  
    return 0;  
}

注意,在调用fseek之前,必须确保已经使用fopen打开了文件,并且传入了正确的文件指针。此外,fseek仅改变文件指针的位置,并不实际读取或写入任何数据。

6 文件重头定位

rewind是C语言标准库中的一个函数,用于将文件内部的位置指针重新指向一个流(数据流/文件)的开头置。语法格式:

void rewind(FILE *stream)
功能:用于将文件内部的位置指针重新指向一个流(数据流/文件)的开头。
参数:
    stream:这是一个指向要操作的文件的指针,通常是由fopen函数返回的。
返回值:
    无

代码示例:

#include <stdio.h>  
  
int main() 
{
    // 打开文件  
    FILE *file = fopen("example.txt", "r");  
    if (file == NULL) 
    {  
        printf("文件打开失败\n");  
        return 1;  
    }  
  
    // 第一次读取文件内容  
    printf("第一次读:\n");  
    char buffer[100] = {0};
    while (fgets(buffer, sizeof(buffer), file)) 
    {  
        printf("%s", buffer);  
    }  
  
    // 使用rewind将文件指针重置到文件开头  
    rewind(file);  
  
    // 第二次读取文件内容  
    printf("\n第二次读:\n");
    while (fgets(buffer, sizeof(buffer), file)) 
    {  
        printf("%s", buffer);  
    }  
  
    // 关闭文件  
    fclose(file);  
    return 0;  
}

7 获取文件当前读写位置

ftell函数是C语言中的一个标准库函数,它的主要功能是返回当前文件指针的位置,即文件位置指针当前位置相对于文件首的偏移字节数。语法格式:

long ftell(FILE *stream)
功能:返回当前文件指针的位置
参数:
    stream:这是一个指向要操作的文件的指针,通常是由fopen函数返回的。
返回值:
    返回当前读写位置(距离文件起始的字节数),出错时返回-1。

代码示例:

#include <stdio.h>  
  
int main() 
{  
    // 打开文件  
    FILE *file = fopen("example.txt", "r");  
    if (file == NULL)
    {  
        printf("文件打开失败\n");  
        
        return 1;  
    }  
  
    // 读取一些内容  
    char buffer[100] = {0};  
    if (fgets(buffer, sizeof(buffer), file))
    {  
        printf("读取一行,内容: %s", buffer);  
    } 
    else 
    {  
        printf("文件读取错误\n");  
        fclose(file);  
        
        return 1;  
    }  
  
    // 使用ftell获取当前文件指针的位置  
    long pos = ftell(file);  
    printf("文件当前位置值: %ld bytes\n", pos);  
  
    // 关闭文件  
    fclose(file);  
  
    return 0;  
}

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值