Android NDK开发(三)C语言IO流

文件IO

我们在开发java应用程序中,会使用File类,FileWriter类,FileReader类,同时也会使用FileOutputStream,FileInputStream,BufferInputStream,BufferOutputStream。那么有这些类可以让我们非常方便的读取文件,如下面的这个例子,是java的文件读取例子

// 读取文件中的字符
    private static void readString() throws Exception{
        File _file = new File("e:"+separetor+"a.txt") ;
        if (!_file.exists()) {
            boolean createStatuts = _file.createNewFile() ;
            if (createStatuts) {
                System.out.println("创建了一个新文件 ,并且创建成功了");
            }else {
                System.out.println("创建新文件失败");
            }
        }

        // 创建输入流
        InputStream fileInputStream = new FileInputStream(_file) ;
        byte[] bytes = new byte[1024] ;
        int len = -1;
        StringBuffer buffer = new StringBuffer() ;
        while ((len = fileInputStream.read(bytes)) != -1) {
            buffer.append(new String(bytes,0,len)) ;
        }
        // 关闭输入流
        fileInputStream.close() ;

        System.out.println(buffer.toString());
    }

    // 将字符串写入文件
    private static void writeString() throws Exception{
        File _file = new File("e:"+separetor+"a.txt") ;
        if (!_file.exists()) {
            boolean createStatuts = _file.createNewFile() ;
            if (createStatuts) {
                System.out.println("创建了一个新文件 ,并且创建成功了");
            }else {
                System.out.println("创建新文件失败");
            }
        }

        // 创建输出流
        OutputStream fileOutputStream = new FileOutputStream(_file) ;
        String info = "《op 青空 pure rouge 君吻》《君吻 その目に映るもの piano》" ;
        fileOutputStream.write(info.getBytes()) ;
        // 关闭输出流
        fileOutputStream.close() ;

    }

这个例子是我抄的,大家如果想进一步看,请查看文件IO
那么其实不管是java还是C语言,流程是一样的
1. 创建一个File对象,用于实际操作
2. 构建输入输出流
3. 创建缓存区,缓存读写数据,将内容从缓存中读取获取输入到内存中
4. 关闭流

#include<stdio.h>
void readTextFile(){
  char* path = "/niupuyue/callback.c";

  //打开文件
  FILE* fp = fopen(path,"r");
  if(fp == NULL){
    printf("打开文件失败\n");
    return;
  }

  //创建字符缓冲区,每次读取一个字符串,都会缓存到字符数组中
  char buffer[1024];
  while(fgets(buffer,1024,fp)){
    printf("%s",buffer);
  }

  //关闭文件流
  fclose(fp);
}

//写入文本文件
void writeTextFile(){
  char* path = "/niupuyue/test.c";
  char* content = "大鹏一日同风起,扶摇直上九万里";
  //打开文件
  //打开只写文件,如果文件存在则文件长度清0,即该文件内容会消失,若文件不存在则建立该文件
  FILE* fp = fopen(path,"w");
  if(fp == NULL){
    printf("打开文件失败");
    return;
  }

  //写入文件
  fputs(content,fp);

  //关闭文件流
  fclose(fp);
}

int main(){
  writeTextFile();
}

这里写图片描述
这里写图片描述
首先通过fopen()函数,得到一个文件指针,操作符r为读取文件流,构建一个buffer的数据缓存区,通过fget循环读取内容,fclose关闭文件流。其中fopen函数非常重要,fopen的函数声明格式是:

_ACRTIMP FILE* __cdecl fopen(
    _In_z_ char const* _FileName,
    _In_z_ char const* _Mode
    );

在这里我们会发现需要传入的有文件全路径名称,然后还有一个mode,这个mode表示我们打开文件的方式,常用的mode样式

mode有下列几种形态字符串:

r 打开只读文件,该文件必须存在。

r+ 打开可读写的文件,该文件必须存在。

w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。

a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。ode有下列几种形态字符串:

上面的所有操作都是操作文件,但如果操作的是二进制文件,则需要在上面的mode的内容上面添加b,如rb,wb
但是操作的流程不变

二进制文件读写

/*读写二进制文件 -- 复制文件*/
void fileCopy() {
    char* currentPath = "E:\\android_pdf\\研磨设计模式.pdf";
    char* destPath = "E:\\android_pdf\\研磨设计模式_new.pdf";

    // 打开文件
    FILE* currentFile_P = fopen(currentPath, "rb");
    FILE* destFile_P = fopen(destPath, "wb");

    // 先读取再写入
    int buffer[1024]; // 数据缓冲区
    int len; // 每次读取数据的长度
    while ((len = fread(buffer,sizeof(int),1024,currentFile_P)) != EOF)
    {
        // 将缓冲区里的内容写入到文件中
        fwrite(buffer, sizeof(int), len, destFile_P);
    }

    // 关闭流
    fclose(destFile_P);
    fclose(currentFile_P);
}

二进制文件读写其实和文件的读写是相同的,唯一不同之处在于使用rb,wb

猜你喜欢

转载自blog.csdn.net/weixin_42580207/article/details/80908940
今日推荐