0
点赞
收藏
分享

微信扫一扫

java算法:选择排序

343d85639154 2024-06-15 阅读 30

1.回顾c语言文件接口

1.1.fopen

我们来实验一下

1.1.1.r选项

#include <stdio.h>
int main()
{
	FILE* fp = fopen("log.txt", "r");
	if (fp == NULL){
		perror("fopen");
		return 1;
	}
	char buffer[64];
	for (int i = 0; i < 5; i++){
		fgets(buffer, sizeof(buffer), fp);//读取
		printf("%s", buffer);
	}
	fclose(fp);
	return 0;
}

 我们发现只是单纯的读取而已

1.1.2.w选项

#include <stdio.h>
int main()
{
	FILE* fp = fopen("log.txt", "w");
	if (fp == NULL){
		perror("fopen");
		return 1;
	}
	int count = 5;
	while (count){
		fputs("hello world\n", fp);//向文件中写入
		count--;
	}
	fclose(fp);
	return 0;
}

运行后,当前路径下会生成log.txt文件,并会写入内容。 

当我们以“w”的方式打开文件代表写入,此时他会清空文件,再帮我们写入。 

1.1.3.其他

再来看一下“r”选项打开文件,可以读取文件中的数据到缓冲区中,并输出到屏幕上。

int main()
{
    FILE* fp = fopen("log.txt", "r");
    if (fp == NULL)
    {
        perror("fopen");
        return 1;
    }
    // 文件操作
 
    char line[64];// 缓冲区
    // fgets是C语言的接口,按行读取,自动在字符结尾添加\0
    while (fgets(line, sizeof(line), fp) != NULL)
    {
        fprintf(stdout, "%s", line);
    }
 
    fclose(fp);
 
    return 0;
}

加入命令行参数后就变成了类似cat命令的操作,也可以给简易的shell添加上这个功能。

int main(int argc, char* argv[])
{
    if (argc != 2)
    {
        printf("请输入两个参数:程序+文件名\n");
        exit(1);
    }
    FILE* fp = fopen(argv[1], "r");
    if (fp == NULL)
    {
        perror("fopen");
        return 1;
    }
    // 文件操作
 
    char line[64];// 缓冲区
    // fgets是C语言的接口,按行读取,自动在字符结尾添加\0
    while (fgets(line, sizeof(line), fp) != NULL)
    {
        fprintf(stdout, "%s", line);
    }
 
    fclose(fp);
 
    return 0;
}

 

2.默认打开的三个流(stdin,stdout,stderr)

Linux下一切皆文件,显示器和键盘也可以看作文件。

        我们能看到显示器上的数据,是因为我们向显示器写入了数据,电脑能获取我们键盘上的字符,是电脑从“键盘文件” 读取了数据。

        需要注意的是,打开文件一定是进程运行的时候打开的,而任何进程在运行的时候都会默认打开三个输入输出流,即标准输入流、标准输出流以及标准错误流,对应到C语言当中就是stdin、stdout以及stderr。
        其中,标准输入流对应的设备就是键盘,标准输出流和标准错误流对应的设备都是显示器。

查看man手册我们就可以发现,stdin、stdout以及stderr这三个家伙实际上都是FILE*类型的。

        当我们的程序被运行起来时,操作系统就会默认使用C语言的相关接口将这三个输入输出流打开。

3.系统文件IO

        通过之前的学习,这些文件操作最终都是访问硬件(显示器、键盘、磁盘)众所周知,OS是硬件的管理者。所有语言上对“文件”的操作,都必须贯穿操作系统。然而OS不相信任何人,访问操作系统,就必须要通过系统接口!!

open/fclose,fread/fwrite,fputs/fgets,fgets/fputs 等库函数一定需要使用OS提供的系统调用接口,接下来我们就来学习文件的系统调用接口,才能做到万变不离其宗!!

我们在Linux平台下运行C代码时,C库函数就是对Linux系统调用接口进行的封装,在Windows平台下运行C代码时,C库函数就是对Windows系统调用接口进行的封装,这样做使得语言有了跨平台性,也方便进行二次开发。

 3.1.open

3.1.1.参数pathname

3.1.2.参数flags 

3.1.3.参数mode

3.1.4.返回值 

3.1.5.使用示例

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
 
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
 
int main()
{
    int fd = open("log.txt", O_WRONLY);//以只读方式打开文件
    if (fd < 0)
    {
        perror("open");
        exit(1);
    }
    
    // 打开成功
   printf("fd: %d\n", fd); 
 
    return 0;
}

 

我们发现,没有log.txt的情况下,只读模式情况下打印了这个

我们换换只写模式

 

还是不会自己创建啊,看来这个写和c语言的w模式还是有点区别的

我们往上看第二个参数,发现创建文件还是要加上一个选项的

我们修改一下代码

       

   这次是创建成功了,但是它的权限好奇怪啊

        我们不要忘了open它有第三个参数mode,这就是创建文件的访问权限,想要给他的权限设置为0666,就要把它传入,当然也要注意umask,系统的默认umask是0002,所以还要在一开始设置当前进程的umask,如何设置也可以用接口。

 

这个权限非常完美了吧!!!

3.2.close

     使用close函数时传入需要关闭文件的文件描述符即可,若关闭文件成功则返回0,若关闭文件失败则返回-1。

 3.3.write

系统接口中使用write函数向文件写入信息,write函数的函数原型如下:

write函数,将buf位置开始向后count字节的数据写入文件描述符为fd的文件当中。

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

 我们来使用一下

又一次写入时,我们发现:

O_TRUNC: 打开文件的时候直接清空文件

 这样就可以变成C语言中fopen的w选项。

这样a选项也就好说了,选项变成O_APPEND就行了。 

O_APPEND: 追加文件

int fd = open("log.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);

3.4.read

  • 第一个参数是文件对应的文件描述符
  • 第二个参数是读取的内容放到这里
  • 第三个参数读取几个字节,返回值为实际读取的字节数读取失败返回-1. 

读文件的前提:文件已经存在,不涉及创建及权限的问题,那么用两个参数的open打开文件即可 

未完待续…… 

举报

相关推荐

0 条评论