c复习day11

fprintf

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int fprintf(FILE *stream,const char *format,);
功能:根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中
指定出现字符串结束符'\0'为止
参数:
stream:已经打开的文件
format:字符串格式,用法和printf()一样
返回值:
成功:实际写入文件的字符个数
失败:-1
代码演示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int year = 2018;
int month = 10;
int day = 23;
char buf[1024] = "";
FILE *fp = fopen("a.txt","w");
if(!fp)
{
perror("");
return -1;
}
fprintf(fp,"04d:%02d:%02d\n",year,month,day);
fclose(fp);
return 0;
}

fscanf

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int fscanf(FILE *stream,const char *format,...);
功能:从stream指定的文件中读取字符串,并根据参数format字符串来转换并格式化数据.
参数:
stream:已经打开的文件
format:字符串格式,用法和scanf()一样
返回值:
成功:参数数目,成功转化的值的个数
失败:-1
代码示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
int year = 0;
int month = 0;
int day = 0;
FILE *fp = fopen("a.txt","r");
if (!fp)
{
perror("");
return -1;
}

fscanf(fp,"%d:%d;%d",&year,&month,&day);
printf("%d %d %d",year,month,day);

return 0;

}

fwrite

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
size_t fwrite(const voit *ptr,size_t size,size_t nmemb,FILE *stream);
功能:以数据块的方式给文件写入内容
参数:
ptr:准备写入文件数据的地址
size:size_tunsigned int类型,此参数指定写入文件内容的块数据大小
nmemb:写入文件的块数,写入文件的数据总大小为:size * nmemb
stream:已经打开的文件指针
返回值:
成功:实际成功写入文件数据的块数目此值和nmemb相等
失败:0
代码示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _std
{
int id;
char name[16];
} STD;
int main()
{
STD num[3] = {{1,"xiao"},{2,"zhong"},{3,"da"}};
FILE *fp = NULL;
int cont = 0;
fp = fopen("fwrite.txt","w");
if (!fp)
{
perror("");
return -1;
}
//fwoite第二个参数为1,为了返回值刚好是写入文件的字节数
cont = fwrite(num,1,sizeof(num),fp);
printf("cont = %d\n",cont);

return 0;

}

fread

1
2
3
4
5
#include <stdio.h>
size_t fream(void *ptr,size_t size,size_t nmemb,FILE *stream);
功能:以数据块的方式从文件中读取内容
参数:
ptr:存放读取出来
代码示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
int year = 0;
int month = 0;
int day = 0;
FILE *fp = fopen("a.txt","r");
if (!fp)
{
perror("");
return -1;
}

fscanf(fp,"%d:%d;%d",&year,&month,&day);
printf("%d %d %d",year,month,day);

return 0;

}

fseek

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int fseek(FILE *stream,long offset,int whence);
功能:
移动文件流(文件光标)的读写位置
参数:
stream:已经打开的文件指针
offset:根据whence来移动的位移数(偏移量),可以是正数,亦可以是负数,吐过是正数,则相对于whence往右移动,否则向左移动.如果向前移动的字节数超过文件开头则出错返回,如果向后移动的字节数超过了问津的末尾,再次写入时将增加文件尺寸
返回值:
成功:0
失败:-1
代码示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
FILE *fp = NULL;
fp = fopen("fseek.txt","w");
if (!fp)
{
perror("");
return -1;
}
fputs("helloworld",fp);
fseek(fp,0,SEEK_SET);//移动光标到开头
fputs("seek",fp);
fseek(fp,-5,SEEK_END);
fputs("abc",fp);

fclose(fp);
return 0;

}

rewing

1
2
3
4
5
6
7
void rewind(FILE *stream);
功能:把文件流(文件光标)的读写位置移动到文件开头
和fseek(fp,0,SEEK_SET);
参数:
stream:已经打开的文件指针
返回值:无返回值

代码演示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
FILE *fp = NULL;
fp = fopen("rewing.txt","w+");
if (!fp)
{
perror("");
return -1;
}
fputs("hellogeek",fp);
rewind(fp);
fputs("nihao",fp);
rewind(fp);
// fclose(fp);
// fp = fopen("rewing.txt","r");
char ch[40];
fgets(ch,sizeof(ch),fp);
printf("%s",ch);
// for (size_t i = 0; i < 15; i++)
// {
// printf("%d ",ch[i]);
// }

fclose(fp);
return 0;


}

ftell

1
2
3
4
5
6
7
8
9
#include <stdio.h>
long ftell(FILE *stream);
功能:获取文件流(文件光标)的读写位置
参数:
stream:已经打开的文件指针
返回值:
成功:当前文件流(文件光标)的读写位置
失败:-1

代码示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
FILE *fp = NULL;
fp = fopen("ftell.txt","w+");
fputs("NIHAO",fp);

printf("%d\n",ftell(fp));
rewind(fp);
printf("%d\n",ftell(fp));
return 0;
}

stat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <sys/types.h>
#include <sys/stat.h>
int stat(const char *path, struct stat *buf);
功能:获取文件状态信息
参数:
path:文件名
buf:保存文件信息的结构体
返回值:
成功:0
失败-1

struct stat {
dev_t st_dev; //文件的设备编号
ino_t st_ino; //节点
mode_t st_mode; //文件的类型和存取的权限
nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1
uid_t st_uid; //用户ID
gid_t st_gid; //组ID
dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号
off_t st_size; //文件字节数(文件大小)
unsigned long st_blksize; //块大小(文件系统的I/O 缓冲区大小)
unsigned long st_blocks; //块数
time_t st_atime; //最后一次访问时间
time_t st_mtime; //最后一次修改时间
time_t st_ctime; //最后一次改变时间(指属性)
};
代码示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
int main()
{
struct stat buf;//buf结构体一定要有空间
int ret = 0;
ret = stat("fwrite.txt",&buf);
if (ret < 0)//如果返回值小于0,代表文件不存在
{
printf("file notfound\n");
}
printf("%d\n",buf.st_size);//buf.st_size 这个是文件大小
system("pause");
return 0;
}

Linux和windows中\n的区别

  • 在windows中存储\n会在前面加一个\n -> \r\n
  • 在windows中取出\n的时候会会将\r\n -> \n
  • 在linux中不会有win上的操作
  • 导致win中在linux中打开会多一个\r
  • linux在win中打开会没有换行

删除文件,重命名

1
2
3
4
5
6
7
8
#include <stdio.h>
int remove(const char *pathname);
功能:删除文件
参数:
pathname:文件名
返回值:
成功:0;
失败:-1;
1
2
3
4
5
6
7
8
9
#include <stdio.h>
int rename(const char *oldpath,const char *newpath);
功能:把oldpath的文件名改为newpath
参数:
oldpath:旧文件名
newpath:新文件名
返回值:
成功:0
失败:-1

文件缓存区

  • 缓冲区就是内存中的一块临时的空间

  • 普通文件刷新缓冲区的方法

    • 缓冲区满
    • fflush函数强制刷新
    • 程序正常退出
  • windows下标准输出stdout文件,没有缓冲区linux有

  • 标准输入不能调用fflush强制刷新

你的支持是我最大的动力!
0%