一、文件
1.标准io:stdio.h
(1)标准io的概念 1975 Dennis r IO库,C语言的标准,ANSI c
IO :input output
I: 键盘是标准输入设备 ====》默认输入就是指键盘 /dev/input
O: 显示器是标准输出设备 ==》默认输出就是指显示器
(2)Linux操作系统当中IO都是对文件的操作
C一部分,任何支持标准C的系统都可使用标准IO实现文件存储
标准IO在UNIX上是对文件IO的封装
一般都是对普通文件操作是一种有缓存的IO 在文件IO和用户程序之间,加入缓冲区,可以
有效减少系统调用的效率,节省系统IO调度资源。
2.文件的概念,作用
linux中一切都是文件。文件用来存储数据(数据,指令);
3.文件的类型
4.io的分类
(1)标准io
ANSI C 设计的一组用文件IO 封装的操作库函数
(2)stdio.h
头文件: stdio.h ==》标准输入输出头文件
/usr/include/stdio.h
<> 是系统库函数,默认路径在/usr/include/
(3)Dennis Ritchie
man man ==>所有man的帮助
man xxx == man 1 xxx ===>查看当前xxx命令
man 2 xxx ===>查看xxx对应的系统调用函数
man 3 xxx ===》查看xxx对应的标准库函数
注:如果没有命令则直接man xxx 会显示其函数\n ;如果没有系统调用则显示系统库函数帮助
4.文件内容的分类
- 文本文件 可见字符 \n
- 二进制文件
5.流
(1)流的定义
FILE*:数据从文件当中流入和流出所体现出来的字节
(2)流的分类
- 二进制流: 2001 \n 二进制数据的流
- 文本流: ASCII码数据的流 \n \t
- FILE 结构定义的对象 FILE * 称之为流对象,也叫文件流指针。
流对象 ===》头 《===数据====》尾
6.文件操作的步骤
(1)打开->> FILE * fp
(2)读写
- fgetc/fputc,,,,,,一个字符,任何文件都能处理
- fgetc(int c ,FILE*strem);
- fgets/fputs....,,一次一行,适合操作文本文件
- fread/fwrite....自定义大小,,二进制
(3)关闭
7.mode文件权限
- r 只读 文件不存在报错 文件存在则只读打开
- r+ 读写 文件不存在报错 文件存在则读写打开
- w 只写 文件不存在则创建 文件存在则清0只写打开
- w+ 写 文件不存在则创建 文件存在则清0写读打开
二、相关函数
(1)fopen
#include<stdio.h>
int main(int argc, char **argv)
{
FILE*fp = fopen("1.txt", "w");//w会将文件清零
if(NULL == fp)
{
fprintf(stderr, "fopen");
return 1;
}
fputc('h',fp);
fputc('e',fp);
fputc('l',fp);
fputc('l',fp);
fputc('o',fp);
fclose(fp);
return 0;
}
注:w会将文件清空 ; FILE*不代表文件内容,它里面有个成员,可以指向文件 ; ll 查看新建文件是否有写入东西;cat 查看文本文件内容;od -c查看二进制文件 ;od -t x1 转为十六进制查看
(2)fgetc
int fgetc(FILE *stream);
功能:从流中读取一个字符
参数:stream:文件流指针
返回值:成功返回读到字符的ASCII码值;读到文件末尾返回EOF;失败返回EOF -1
c= fgetc(stdin);
fputc(c,stdout);
获取键盘上面的输入,显示到屏幕。
#include<stdio.h>
int main(int argc, char **argv)
{
FILE*fp=fopen("1.txt", "r");
if(NULL == fp)
{
fprintf(stderr, "fopen error\n");
return 1;
}
while(1)
{
int c=fgetc(fp);
if(EOF == c)
{
break;
}
printf("%c",c);
}
fclose(fp);
return 0;
}
(3)cp_fetc
#include <stdio.h>
// ./a.out srcfile1 dstfile2
int main(int argc, char** argv)
{
FILE* src = fopen(argv[1], "r");
FILE* dst = fopen(argv[2], "w");
if (NULL == src || NULL == dst)
{
fprintf(stderr, "fopen error\n");
return 1;
}
while (1)
{
int c = fgetc(src);
if(EOF == c)
{
break;
}
fputc(c, dst);
}
fclose(dst);
fclose(src);
return 0;
}
(4)main_argc
#include <stdio.h>
int main(int argc, char * argv[])
{
printf("argc is %d\n",argc);
int i = 0 ;
for(i=0;i<argc;i++)
{
printf("%s\n",argv[i]);
}
return 0;
}
(5)cp_argc
#include <stdio.h>
int main(int argc, char** argv)
{
if (argc < 3)
{
fprintf(stderr, "usage:./a.out srcfile dstfile\n");
return 1;
}
FILE* src = fopen(argv[1], "r");
FILE* dst = fopen(argv[2], "w");
if (NULL == src || NULL == dst)
{
fprintf(stderr, "fopen error\n");
return 1;
}
while (1)
{
int c = fgetc(src);
if (EOF == c)
{
break;
}
fputc(c, dst);
}
fclose(dst);
fclose(src);
return 0;
}
(6)fgets:按行获取数据
char *fgets(char *s, int size, FILE *stream);
功能:从stream流对象关联的文件中获取size大小字节的文本数据并存储到s对应的本地内存(栈区
数组,堆区内存).
参数:s 要存储数据的本地内存;size 要获取的数据长度,单位字节。stream 要获取的目标文件流
对象,可以是stdin ,程序会阻塞等待如果是普通文件fp 则指向文件第一行数据
返回值:成功 返回指向有效数据的首地址,一般等于s的地址
失败 或者 文件末尾 NULL;
#include <stdio.h>
int main(int argc, char **argv)
{
if (argc < 2)
{
fprintf(stderr, "usage:./a.out filename\n");
return 1;
}
FILE*fp = fopen(argv[1], "r");
if(NULL==fp)
{
fprintf(stderr, "fopen error\n");
return 1;
}
while(1)
{
char buf[1024]={0};
if(NULL== fgets(buf,sizeof(buf),fp))
{
break;
}
printf("%s",buf);
}
fclose(fp);
return 0;
}
(7)fputs:按行获取数据
#include <stdio.h>
int main(int argc, char **argv)
{
FILE*fp=fopen("3.txt", "w");
if(NULL==fp)
{
fprintf(stderr, "fopen error\n");
return 1;
}
char buf[] = "world";
char str[] = "aaabbb";
fputs("hello",fp);
fputs(buf, fp);
fputs(str+3, fp);
fclose(fp);
return 0;
}
(8)cp_fgets
#include <stdio.h>
int main(int argc, char** argv)
{
if (argc < 3)
{
fprintf(stderr, "usage:./a.out srcname dstname\n");
return 1;
}
FILE* src = fopen(argv[1], "r");
FILE* dst = fopen(argv[2], "w");
if (NULL == src || NULL == dst)
{
fprintf(stderr, "fopen error\n");
return 1;
}
while (1)
{
char buf[1024] = {0};
if (NULL == fgets(buf, sizeof(buf), src))
{
break;
}
fputs(buf, dst);
}
fclose(dst);
fclose(src);
return 0;
}
(9)统计文本文件中a-z,出现的次数,并输出。 /etc/passwd
#include <stdio.h>
int main(int argc, char **argv)
{
FILE*fp = fopen("/etc/passwd", "r");
if(NULL == fp)
{
fprintf(stderr, "fopen error\n");
return 1;
}
int counter=0;
char buf[1024]={0};
while(1)
{
if(NULL== fgets(buf,sizeof(buf),fp))
{
break;
}
if('\n' !=buf[strlen(buf)-1])
{
counter++;
}
}
printf("counter = %d\n",counter);
fclose(fp);
return 0;
}
注:wc-l /etc/passwd 小命令用来统计行号
(10)统计文本文件的行数,并输出
#include <stdio.h>
int main(int argc, char **argv)
{
FILE*fp = fopen("/etc/passwd", "r");
if(NULL == fp)
{
fprintf(stderr, "fopen error\n");
return 1;
}
//方法一:
int a[26] = {0};
while (1)
{
int c = fgetc(fp);
if(EOF == c)
{
break;
}
if(c>='a'&&c<='z')
{
a[c-'a']++;
}
}
int i = 0;
for(i=0;i<26;++i)
{
printf("%c : %d\n",i+'a',a[i]);
}
fclose(fp);
//方法二:
// for(char i ='a';i<='z';++i)
// {
// int counter=0;
// FILE*fp = fopen("/etc/passwd", "r");
// while(1)
// {
// char c=fgetc(fp);
// if(EOF == c)
// {
// break;
// }
// if(c==i)
// {
// counter++;
// }
// }
// printf("%c : %d \n",i ,counter);
// fclose(fp);
// }
return 0;
}