Linux C/C++基础——文件(上)
2024-09-05 12:47:48
1.文件指针
FILE* fp=NULL;
- fp指针,只调用了fopen(),在堆区分配空间,把地址返回给fp
- fp指针不是指向文件,fp指针和文件关联,fp内部成员保存在文件的状态
- 操作fp指针,不能直接操作,必须通过文件库函数来操作fp指针
- 通过库函数操作fp指针,对文件的任何操作,fp里面成员会相应的变化(系统自动完成)
- FILE所有平台的名字都一样,FILE是一个结构体,里面的成员功能一样,不同平台成员的名字不一样
2.文件的操作
c语言中三个特殊的文件指针(无需定义可直接使用):stdin、stdout、stderr
3.文件的打开
文件的路径:
补充:在VS中,相对路径
a.编译同时直接运行程序,相对路径,相对于xxxx.vcxproj(项目文件)所在的路径
b.如果直接在Debug中直接运行程序,相对路径相对于可执行程序
在Qt中
a.编译同时直接运行程序,相对路径,相对于项目文件夹所对应的build中的debug所在的路径
b.如果直接在Debug中直接运行程序,相对路径相对于可执行程序
#include<stdio.h> int main()
{
FILE*fp=NULL;
//打开成功,返回有效地址
//打开失败,返回NUULL
fp=fopen("./08txt","r");//文件不存在
if(fp==NULL)
{
perror("fopen");
return ;
}
fclose(fp);
fp=NULL;
return ;
}
4.文件的写入
#include <stdio.h>
int fputc(int ch, FILE * stream);
功能:将ch转换为unsigned char后写入stream指定的文件中,输入的字符最终转化为数字,每次写入一个字符
参数:
ch:需要写入文件的字符
stream:文件指针
返回值:
成功:成功写入文件的字符
失败:返回-1
#include<stdio.h>
#include<string.h> int main()
{
FILE *fp;
fp=fopen("08.txt","w");
if(fp==NULL)
{
perror("fopen"); return -;
}
fputc('a',fp);
fputc('b',fp);
fputc('c',fp);
fputc(,fp); char ch='a';
while(ch<='z')
{
fputc(ch,fp);
ch++;
}
char buf[]="zxcvbnm";
int n=strlen(buf);
for(int i=;i<n;i++)
{
fputc(buf[i],fp);
} fclose(fp);
fp=NULL; return ;
}
5.文件的读
#include <stdio.h>
int fgetc(FILE * stream);
功能:从stream指定的文件中读取一个字符,每次读出一个字符,读完光标自动跳转到下一个字符前
参数:
stream:文件指针
返回值:
成功:返回读取到的字符
失败:-
文件末尾的判断
在C语言中,EOF表示文件结束符(end of file)。
在while循环中以EOF作为文件结束标志,
这种以EOF作为文件结束标志的文件,必须是文本文件。
在文本文件中,数据都是以字符的ASCII代码值的形式存放。
我们知道,ASCII代码值的范围是0~,不可能出现-,
因此可以用EOF作为文件结束标志。
if(ch==EOF)等价于if(ch==-1)
当把数据以二进制形式存放到文件中时,就会有-1值的出现,
因此不能采用EOF作为二进制文件的结束标志。
为解决这一个问题,ANSI C提供一个feof函数,用来判断文件是否结束。
feof函数既可用以判断二进制文件又可用以判断文本文件。
feof(fp);
- 如果第一次没有对文件进行读操作,直接调用此函数,永远返回假(文件没有到结尾)
- 此函数必须,先读,再调用feof()才有意义
- 调用此函数,光标不会自动往后移动
- 必须读取后,才能判断是否结束,判断的是读取的字符
#include<stdio.h>
#include<string.h> int main()
{
FILE *fp;
fp=fopen("09.txt","w");
if(fp==NULL)
{
perror("fopen"); return -;
}
char ch='a';
while(ch<='z')
{
fputc(ch,fp);
ch++;
}
fclose(fp);
FILE *fp1=fopen("09.txt","r");
char chr;
while()
{
chr=fgetc(fp1);
printf("chr=%d\n",chr);//以字符形式输出
if(chr==-)
{
break;
}
}
fclose(fp1);
fp=NULL; return ;
}
最新文章
- git 常用命令使用
- POJ 1971 统计平行四边形 HASH
- Spring MVC mapping[From Spring MVC Beginner&#39;s Guide]
- STL1-unordered_map
- Ubuntu16.04.1 安装MyCat
- [原]Java面试题-将字符串中数字提取出来排序后输出
- poj--1579--(DFS+记忆化搜索之经典)
- Augular JS里的各种ng
- C# 处理文件,视频,音频,压缩包下载
- Android为TV端助力 UDP协议
- sklearn.linear_model.LogisticRegression参数说明
- failed to install tomcat6 service ,check your setting and permissions
- Expo大作战(三十七)--expo sdk api之 GLView,GestureHandler,Font,Fingerprint,DeviceMotion,Brightness
- C_数据结构_快速排序
- 修改docker的地址为阿里云源
- Eureka 开发时快速剔除失效服务
- C# 如何提取字符串中的数字
- luogu P4051 [JSOI2007]字符加密
- 使用Mobx插件查看mobx的变量值
- (精品)微信支付android端
热门文章
- 报表开发神器!DevExpress Reporting v19.1:WinForms平台新功能
- java.sql.SQLException: Unknown column &#39;user0_.user_name&#39; in &#39;field list&#39; 报错问题
- 用脚本来运行scrapy crawl ...
- 使用SpringSession和Redis解决分布式Session共享问题
- 课程 6;比特币产生,分配(2100w,10个矿区)
- Java 实现在固定区间内随机生成整数
- yii框架学习(MVC)
- 如何理解JS内的Truthy值和Falsy值
- 整合到 Mockito 2
- MessagePack Jackson 数据大小