c语言--文件操作

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

  • 文件打开: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-1,fgets 只会读取部分行。
  • 如果需要连续读取多行数据,并且每行数据的长度可能超过 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; 

}

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值