例题3-文件操作

之前用的不多,见到时有点懵,记录以备查阅


fopen打开文件

返回FILE*,如果该指针为NULL,表未打开文件

比较简单,两个参数,第一个为文件,第二个为模式

其中“r”只读;“w”写入;"a"追加写入

“w+b”b区分二进制文件(windows下);linux不区分

写入有int类型,也是二进制的范围。单纯char的才用w+.

w是以文本方式打开文件,wb是二进制方式打开文件,以文本方式打开文件时,fwrite函数每碰到一个0x0A时,

就在它的前面加入0x0D.其它内容不做添加操作

fseek

头文件stdio.h

重定位流上的文件指针
原型: 

int fseek(FILE *stream, long offset, int fromwhere);


参数介绍: stream为文件指针。从fromwhere开始,偏移offset个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
返回值: 成功,返回0,否则返回其他值。


fread与fwrite 写入与读取

调用:

size_t fread( void * buffer,size_t size,size_t n, FILE * fp);

fp文件指针,读n个字段,每个size字节,放入buffer中;

返回实际读取的字节数

size_t fwrite( void * buffer,size_t size,size_t n, FILE * fp);

参数同上


rewind

原型:void rewind(FILE *fp)

作用:使文件fp的位置指针指向文件开始。

ftell(fp)

获得当前的位置指针


fclose关闭文件


此外,还有

int fgetc(fp);

int fputc(int c, fp);

fputc 会将参数c 转为unsigned char 后写入参数stream 指定的文件中.

读取写入字符


例题:

#include 
main()
{ 
    FILE *fp;
    int i,a[ 6]={1,2,3,4,5,6},k;
    fp = fopen ("data.dat", "w+b");
    for (i=0;i<6;i+ +)
    { 
        fseek(fp,0L,0);
        fwrite(&a[5—i],sizeof(int),1,fp);
    }//反复在第一行覆盖写入,最终写入1
    rewind(fp);//文件指针重置指向开头
    fread(&k,sizeof(int),1,fp);//读取第一行k为1
    fclose(fp);
    printf("%d",k);
}

同时应注意读取写入时内容的大小,类型


文件指针

是文件操作系统数据结构内部的一种数据指针,它用于标注文件当前读写位置,C语言中,文件指针以字节为单位
C语言的文件指针采用long型值

执行文件读/写操作后,文件指针自动向后移动,指到新的待读/写位置

### C语言文件操作经典例题 #### 文件读写操作示例 下面展示的是如何利用`fprintf`和`fscanf`来实现结构体数据的存储与读取。此过程不仅涉及到了基本的数据输入输出,还涵盖了错误处理以及资源释放等内容。 ```c #include <stdio.h> struct Student { char name[20]; int age; float score; }; int main() { struct Student stu = {"Alice", 20, 87.5}; /// 创建并打开用于写的文件 FILE *fp_write = fopen("students.dat", "wb"); if (!fp_write) { perror("Failed to open file for writing"); return -1; } fwrite(&amp;stu, sizeof(struct Student), 1, fp_write); fclose(fp_write); /// 打开用于读取刚才创建的二进制文件 FILE *fp_read = fopen("students.dat", "rb"); if (!fp_read) { perror("Failed to open file for reading"); return -1; } struct Student read_stu; fread(&amp;read_stu, sizeof(struct Student), 1, fp_read); printf("Name: %s\nAge: %d\nScore: %.2f\n", read_stu.name, read_stu.age, read_stu.score); fclose(fp_read); return 0; } ``` 上述代码展示了通过二进制模式(`b`)来进行学生信息的存盘与加载[^1]。 #### 处理大文本文件的例子 对于较大的纯文本日志或其他类型的大型文本文件来说,逐行读入可能是更高效的方式之一: ```c #include <stdio.h> #define MAX_LINE_LENGTH 256 void process_large_text_file(const char *filename) { FILE *file_ptr = fopen(filename, "r"); if (file_ptr != NULL) { char line[MAX_LINE_LENGTH]; while(fgets(line, sizeof(line), file_ptr)) { // 对每一行执行特定的操作... puts(line); // 这里简单打印出来作为示范 } fclose(file_ptr); } else { perror("Error opening file."); } } int main(){ const char* filename="large_log.txt"; process_large_text_file(filename); return 0; } ``` 这段程序会尝试按照行的形式逐步解析指定的大尺寸文本文件,并针对每一条记录采取适当措施[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值