C语言与Linux系统文件操作函数大全

目录

一、C语言——fopen函数

二、C语言——fwrite函数

三、C语言——fread函数

四、C语言——fseek函数

1、Linux系统——open接口

2、Linux系统——write接口

3、Linux系统——read接口

4、Linux系统——lseek接口


一、C语言——fopen函数

fopen函数是C标准库提供的打开文件的函数。

有2个参数

第一个是要打开的文件(包含路径)

第二个是打开方式。关于打开方式主要有以下这些::

r:  只读方式打开文件,该文件必须存在。

r+:读/写方式打开文件,该文件必须存在。

rb:只读方式打开一个二进制文件,该文件必须存在。

rb+:读/写方式打开一个二进制文件,该文件必须存在。

rt:   只读方式打开一个文本文件,该文件必须存在。

rt+: 读/写方式打开一个文本文件,该文件必须存在。

w:  只写方式打开文件,若文件存在,则覆盖原内容;若文件不存在,创建该文件。

w+:读/写方式打开文件,若文件存在,则覆盖原内容;若文件不存在,创建该文件。

wb:只写方式打开一个二进制文件,若文件存在,则覆盖原内容;若文件不存在,创建该文件。

wb+:读/写方式打开一个二进制文件,若文件存在,则覆盖原内容;若文件不存在,创建该文件。

wt:只写方式打开一个文本文件,若文件存在,则覆盖原内容;若文件不存在,创建该文件。

wt+:只写方式打开一个文本文件,若文件存在,则覆盖原内容;若文件不存在,创建该文件。

a:  以追加的方式打开只写文件,文件存在时写入数据到文件结尾;文件不存在创建该文件(EOF符保留)

a+:以追加的方式打开读/写文件,文件存在时写入数据到文件结尾;文件不存在创建该文件(EOF符不保留)

ab+:以追加的方式打开读/写二进制文件...

at+: 以追加的方式打开读/写文本文件...

返回值

成功返回一个FILE pointer(文件指针),失败返回NULL。

例子:

     FILE* fp = fopen("bite.txt","wb+");
     if(fp == NULL){
         perror("open");
        return -1;
     }

二、C语言——fwrite函数

size_t fwrite(const void* ptr,size_t size,size_t nmemb,FILE* stream);

fwrite 和 fread函数既可操作文本文件,也可操作二进制文件。

fwrite是将ptr指针指向的数据写到文件流中。

参数:

有4个参数,第一个是ptr指针,指向要写出的数据的内存首地址;第二个是要写出的数据的基本单元大小以字节为单位(如:sizeof(char);第三个是基本单元个数;第四个是打开的文件指针。

返回值:

写入成功返回写入的基本单元个数,写入失败返回0,基本单元个数 != nmemb。

例子:

 23    const  char* data = "Linux so easy!";
 24     size_t ret = fwrite(data,sizeof(char),strlen(data),fp);
 25     if(ret != 1){
 26         printf("fwrite error\n");
 27         return -1;
 28     }

三、C语言——fread函数

size_t fread(const void* ptr,size_t size,size_t nmemb,FILE* stream);

fwrite 和 fread函数既可操作文本文件,也可操作二进制文件。

fread是将文件流中的数据读取到缓冲区ptr。

参数:

第一个是指针ptr,指向缓冲区,第二个是要读取的数据的基本单元大小;第三个是基本单元个数;第四个是打开的文件指针。

返回值:

读取成功返回读取到的基本单元个数,若失败或者读到文件末尾返回0,个数<nmemb。

fread不区分文件结尾和读取错误,可以调用ferror判断错误以及用feof判断文件结尾。

例子:

 32     char buf[1024];
 33     size_t _ret = fread(buf,sizeof(char),sizeof(buf)-1,fp);
 34     if(_ret == 1){
 35         printf("%s\n",buf);
 36     }
 37     else{
 38         if(ferror(fp)){
 39             printf("fread error\n");
 40         }
 41         else if(feof(fp)){
 42             printf("end of file\n");
 43         }
 44         return -1;
 45     }

四、C语言——fseek函数

 fseek函数是用来重新定位流上的文件指针的。

参数:

第一个参数是文件流;第二个参数是偏移量,以第三个参数为基准偏移offset个字节位置。

whence为基准有3个:

SEEK_SET(0):文件开头

SEEK_CUR(1):文件当前位置

SEEK_END(2):文件结尾

offset是偏移量,正整数表示正向偏移,负整数表示负向偏移。

例子:fseek(fp,-1L ,SEEK_CUR) 调整文件指针,距文件当前位置-1个偏移量。

           fseek(fp,100L,SEEK_END) 调整文件指针,距文件结尾100个偏移量。

返回值:

成功调整文件指针返回0,失败返回其他值,并且失败不改变文件指针指向。

1、Linux系统——open接口

 open接口有2个,拿第二个来说。

参数:

第一个参数是文件名(包含路径),第二个参数是flags,是打开文件的方式,有一下几种:

O_WRONLY:只写                        O_RDONLY:只读

O_RDWR:读写                            O_CREAT:创建文件

O_TRUNC:已经存在文件清空内容        O_APPEND:追加写入

可以组合使用,用 | 组合。

例子:

 19     int fd = open("./bite.txt",O_RDWR | O_CREAT,0664);                                                                           
 20     if(fd < 0){                                                                                                                  
 21         perror("open");                                                                                                          
 22         return -1;                                                                                                               
 23     }  

返回值:

返回一个整数文件描述符fd,>0 打开成功;<0 打开失败。

2、Linux系统——write接口

write接口向打开的文件中写入数据。

参数:

第一个参数fd:文件描述符,代表要写入的文件;第二个参数buf,要写入的数据缓冲区,注意void*,按字节写入;第三个参数count,要写入的字节数。

 返回值:

写入成功,返回写入的字节数;失败,返回-1.

例子:

 5     const char* data = "i like Linux!";
 26     ssize_t ret = write(fd,data,strlen(data));
 27     if(ret == -1){
 28         printf("write error\n");
 29         return -1;
 30     }

3、Linux系统——read接口

read接口读取文件中的数据放到缓冲区。

参数:

第一个参数fd:文件描述符,代表要读取的文件;第二个参数buf,要放入数据的缓冲区,注意void*;第三个参数count,字节数。

 返回值:

读取成功,返回读到的字节数;失败,返回-1;到达文件结尾返回0

例子:

 34     char buf[1024];
 35     ssize_t _ret = read(fd,buf,strlen(buf)-1);
 36     if(_ret == 0){
 37         printf("end of file\n");
 38         return -1;
 39     }
 40     else if(_ret < 0){
 41         perror("read error\n");
 42         return -1;
 43     }
 44     fprintf(stdout,"%s\n",buf);

4、Linux系统——lseek接口

 重新定位流上的文件指针。

参数与上文fseek几乎一致,不再赘述。

返回值:

off_t :指示文件偏移量,32位下为long类型,默认为32位整数,64位下为long long,64位整数。

成功返回从头部开始计算的位置偏移量(以字节为单位);错误返回-1 。

例子:

  lseek(fd,0,SEEK_SET);

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
学生成绩管理系统是一个常见的项目,可以用来对学生的成绩进行增删改查和排序等操作。在C语言中,可以使用文件来存储学生的信息,并通过读写文件来实现对学生成绩的管理。 以下是一个简单的学生成绩管理系统的示例代码: ```c #include <stdio.h> #include <stdlib.h> struct Student { char name[50]; int score; }; void addStudent() { struct Student student; FILE *file = fopen("students.txt", "a"); printf("请输入学生姓名:"); scanf("%s", student.name); printf("请输入学生成绩:"); scanf("%d", &student.score); fprintf(file, "%s %d\n", student.name, student.score); fclose(file); printf("学生信息添加成功!\n"); } void deleteStudent() { char name[50]; printf("请输入要删除的学生姓名:"); scanf("%s", name); FILE *file = fopen("students.txt", "r"); FILE *tempFile = fopen("temp.txt", "w"); struct Student student; while (fscanf(file, "%s %d", student.name, &student.score) != EOF) { if (strcmp(student.name, name) != 0) { fprintf(tempFile, "%s %d\n", student.name, student.score); } } fclose(file); fclose(tempFile); remove("students.txt"); rename("temp.txt", "students.txt"); printf("学生信息删除成功!\n"); } void displayStudents() { FILE *file = fopen("students.txt", "r"); struct Student student; while (fscanf(file, "%s %d", student.name, &student.score) != EOF) { printf("姓名:%s,成绩:%d\n", student.name, student.score); } fclose(file); } void sortStudents() { FILE *file = fopen("students.txt", "r"); struct Student students[100]; int count = 0; while (fscanf(file, "%s %d", students[count].name, &students[count].score) != EOF) { count++; } for (int i = 0; i < count - 1; i++) { for (int j = 0; j < count - i - 1; j++) { if (students[j].score < students[j + 1].score) { struct Student temp = students[j]; students[j] = students[j + 1]; students[j + 1] = temp; } } } printf("按成绩降序排序后的学生信息:\n"); for (int i = 0; i < count; i++) { printf("姓名:%s,成绩:%d\n", students[i].name, students[i].score); } fclose(file); } int main() { int choice; while (1) { printf("学生成绩管理系统\n"); printf("1. 添加学生信息\n"); printf("2. 删除学生信息\n"); printf("3. 显示学生信息\n"); printf("4. 按成绩排序\n"); printf("5. 退出\n"); printf("请输入操作编号:"); scanf("%d", &choice); switch (choice) { case 1: addStudent(); break; case 2: deleteStudent(); break; case 3: displayStudents(); break; case 4: sortStudents(); break; case 5: exit(0); default: printf("无效的操作编号!\n"); break; } } return 0; } ``` 这个示例代码实现了学生成绩管理系统的基本功能,包括添加学生信息、删除学生信息、显示学生信息和按成绩排序等操作。你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值