Android NDK开发(C语言-文件读写)

目录
  • 1.文件读写
    • 1.1打开文件
    • 1.2关闭文件
    • 1.3读取文件
    • 1.4写入文件
    • 1.5读写二进制I/O文件
    • 1.6获取文件的大小
    • 1.7文本简单加密、解密
    • 1.8二进制文件简单加解密

1.文件读写

一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节。C 语言不仅提供了访问顶层的函数,也提供了底层(OS)调用来处理存储设备上的文件。

1.1打开文件

我们可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE 包含了所有用来控制流的必要的信息。

下面是这个函数调用的原型:

FILE *fopen( const char * filename, const char * mode );

在这里,filename 是字符串,用来命名文件,访问模式 mode 的值可以是下列值中的一个:

模式 描述
r 打开一个已有的文本文件,允许读取文件。
w 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。
a 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
r+ 打开一个文本文件,允许读写文件。
w+ 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+ 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。

如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

1.2关闭文件

为了关闭文件,请使用 fclose( ) 函数。

函数的原型如下:

 int fclose( FILE *fp );

如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。EOF 是一个定义在头文件 stdio.h 中的常量。
C 标准库提供了各种函数来按字符或者以固定长度字符串的形式读写文件。

1.3读取文件

下面是从文件读取单个字符的最简单的函数:

int fgetc( FILE * fp );

fgetc() 函数从 fp 所指向的输入文件中读取一个字符。返回值是读取的字符,如果发生错误则返回 EOF。下面的函数允许您从流中读取一个字符串:

char *fgets( char *buf, int n, FILE *fp );

函数 fgets() 从 fp 所指向的输入流中读取 n - 1 个字符。它会把读取的字符串复制到缓冲区 buf,并在最后追加一个 null 字符来终止字符串。
如果这个函数在读取最后一个字符之前就遇到一个换行符 '\n' 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符。您也可以使用 int fscanf(FILE *fp, const char *format, ...) 函数来从文件中读取字符串,但是在遇到第一个空格字符时,它会停止读取。

示例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

//读取文本文件
void main() {

    char path[] = "C:\Users\Administrator\Desktop\friend.txt"; //文本中语句为 hello world

    //打开
    FILE *fp = fopen(path, "r");
    if (fp == NULL)
    {
        printf("文件打开失败...");
        return;
    }
    //读取
    char buff[50];//缓冲
    while (fgets(buff,50,fp)) {
        printf("%s", buff);
    }

    //关闭
    fclose(fp);

    getchar();

}

结果输出:

 hello world

1.4写入文件

下面是把字符写入到流中的最简单的函数:

int fputc( int c, FILE *fp );

函数 fputc() 把参数 c 的字符值写入到 fp 所指向的输出流中。如果写入成功,它会返回写入的字符,如果发生错误,则会返回 EOF。

我们可以使用下面的函数来把一个以 null 结尾的字符串写入到流中:

int fputs( const char *s, FILE *fp );

函数 fputs() 把字符串 s 写入到 fp 所指向的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF。您也可以使用 int fprintf(FILE *fp,const char *format, ...) 函数来写把一个字符串写入到文件中。

尝试下面的实例:

//写入文本文件
void main() {
    char *path = "C:\Users\Administrator\Desktop\test.txt";
    //打开
    FILE *fp = fopen(path, "w");
    char *text = "今天天气不错\n出去玩吧!";
    fputs(text,fp);

    //关闭
    fclose(fp);
    getchar();

}

在test文本中输出:

今天天气不错
出去玩吧!

注意:请确保您有可用的 /tmp 目录,如果不存在该目录,则需要在您的计算机上先创建该目录。

1.5读写二进制I/O文件

计算机的文件存储在物理上都是二进制,文本文件和二进制之分,其实是一个人为的逻辑之分。

C读写文本文件与二进制文件的差别仅仅体现在回车换行符:

  • 1.写文本时,每遇到一个'\n',会将其转换成'\r\n'(回车换行)。
  • 2.读文本时,每遇到一个'\r\n',会将其转换成'\n'。
  • 3.但是读写二进制文件的时候并不会做以上转换。

函数原型

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

其中:

  • ptr:指向保存结果的指针;
  • size:每个数据类型的大小;
  • count:数据的个数;
  • stream:文件指针

函数返回读取数据的个数。

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

其中,ptr:指向保存数据的指针;size:每个数据类型的大小;count:数据的个数;stream:文件指针
函数返回写入数据的个数。

下面是二进制文件读写的例子(图片的复制):

void main() {
    char *read_path = "D:\BaiduNetdiskDownload\ndk\2016_08_08_C_联合体_枚举_IO\files\girl.png";
    char *write_path = "D:\BaiduNetdiskDownload\ndk\2016_08_08_C_联合体_枚举_IO\files\girl_new.png";
    //b字符表示操作二进制文件binary
    FILE *read_fp  = fopen(read_path, "rb");
    //写的文件
    FILE *write_fp = fopen(write_path,"wb");

    //复制
    int buff[50]; //缓冲区域
    int len = 0;//每次读到的数据长度
    while ((len = fread(buff,sizeof(int), 50,read_fp))!=0) {//50 是写的比较大的一个数
        //将读到的内容写入新的文件
        fwrite(buff, sizeof(int), len, write_fp);
    }

    fclose(read_fp);
    fclose(write_fp);

    getchar();

}

1.6获取文件的大小

void main() {
    char *read_path = "D:\BaiduNetdiskDownload\ndk\2016_08_08_C_联合体_枚举_IO\files\girl.png";
    FILE *fp = fopen(read_path, "r");
    //重新定位文件指针
    //SEEK_END文件末尾,0偏移量
    fseek(fp, 0, SEEK_END);
    //返回当前的文件指针,相对于文件开头的位移量
    long filesize = ftell(fp);
    printf("%d\n", filesize);

    getchar();
}

1.7文本简单加密、解密

void crypt(char normal_path[], char crypt_path[]) {
    //打开文件
    FILE *normal_fp = fopen(normal_path, "r");
    FILE *crypt_fp = fopen(crypt_path, "w");
    //一次读取一个字符
    int ch;
    while ((ch = fgetc(normal_fp)) != EOF) { //End of File
        //写入(异或运算)
        fputc(ch ^ 9, crypt_fp);
    }
    //  关闭
    fclose(crypt_fp);
    fclose(normal_fp);
}

//解密
void decrypt(char crypt_path[],char decrypt_path[]) {
    //打开文件
    FILE *normal_fp = fopen(crypt_path,"r");
    FILE *crypt_fp = fopen(decrypt_path, "w");
    //一次读取一个字符
    int ch;
    while ((ch = fgetc(normal_fp)) !=EOF)//End of File
    {
        //写入(异或运算)
        fputc(ch ^ 9, crypt_fp);
    }
    //关闭
    fclose(crypt_fp);
    fclose(normal_fp);

}

void main() {
    char *normal_path = "D:\userinfo.txt";
    char *crypt_path = "D:\userinfo_crypt.txt";
    char *decrypt_path = "D:\userinfo_decrypt.txt";
    //加密文件
    crypt(normal_path, crypt_path);
    //解密文件
    decrypt(crypt_path, decrypt_path);

    getchar();
}

1.8二进制文件简单加解密

void crypt(char normal_path[], char crypt_path[], char password[]) {
    //打开文件
    FILE *normal_fp = fopen(normal_path, "rb");
    FILE *crypt_fp = fopen(crypt_path, "wb");
    //一次读取一个字符
    int ch;
    int i = 0; //循环使用密码中的字母进行异或运算
    int pwd_len = strlen(password); //密码的长度
    while ((ch = fgetc(normal_fp)) != EOF) { //End of File
    //写入(异或运算)
        fputc(ch ^ password[i % pwd_len], crypt_fp);
        i++;
    }
    //关闭
    fclose(crypt_fp);
    fclose(normal_fp);
}

//解密
void decrypt(char crypt_path[], char decrypt_path[], char password[]) {
    //打开文件
    FILE *normal_fp = fopen(crypt_path, "rb");
    FILE *crypt_fp = fopen(decrypt_path, "wb");
    //一次读取一个字符
    int ch;
    int i = 0; //循环使用密码中的字母进行异或运算
    int pwd_len = strlen(password); //密码的长度
    while ((ch = fgetc(normal_fp)) != EOF) { //End of File
    //写入(异或运算)
        fputc(ch ^ password[i % pwd_len], crypt_fp);
        i++;
    }
    //关闭
    fclose(crypt_fp);
    fclose(normal_fp);

}

void main() {
    char *normal_path = "D:\girl.png";
    char *crypt_path = "D:\girl_crypt.png";
    char *decrypt_path = "D:\girl_decrypt.png";

    //加密文件
    crypt(normal_path, crypt_path, "123456");

    //加密文件
    decrypt(crypt_path, decrypt_path, "123456");

    getchar();
}

一般腾讯、阿里等大公司的用户关键数据是用C\C++(动态库so反编译很难)加密的。因为Java的加密方法反编译比较容易破解。

到此这篇关于Android NDK开发(C语言-文件读写)的文章就介绍到这了,更多相关C语言-文件读写内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言文件读写操作介绍与简单示例

    文件的打开函数fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了.当使用打开函数时,必须给出文件名.文件操作方式(读.写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头.若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件,并将文件指针指向文件开头. fopen(char *filename,char *ty

  • C语言实现文件读写操作

    本文实例为大家分享了C语言实现文件读写操作的具体代码,供大家参考,具体内容如下 键盘读入字符串写到文件中,再从文件读出显示在控制台 #include<stdio.h> #include<string.h> int main() { FILE *fp; char string[6];//方括号中是几就输入几个字符串 if( (fp=fopen("file.txt","w"))==NULL ) { printf("cannot open

  • Android NDK开发(C语言--动态内存分配)

    1.C 内存管理函数 C 语言为内存的分配和管理提供了几个函数.这些函数可以在 <stdlib.h> 头文件中找到. 序号 函数和描述 1 void calloc(int num, int size); 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0.所以它的结果是分配了 numsize 个字节长度的内存空间,并且每个字节的值都是0. 2 void free(void *address); 该函数释放 address 所指向的内存块,释放的是动态分配的

  • C语言实现文件读写

    关于C语言的文件读写,我将介绍下面这几种方式: 字符的读写:使用 fgetc() 函数 和 fputc() 函数: 字符串的读写:使用 fgets() 函数和 fputs() 函数: 格式化的读写(主要用于文本文件):使用 fscanf() 函数和 fprintf() 函数. 字符读写: 1. fputc()函数 fputc(c,fp); //用于将一个字符写入文件 其中,fp为文件指针变量:c为要写入的字符,可以是字符常量或字符型变量.函数返回值:如果执行成功,返回写入的字符:否则,返回EOF

  • Android NDK开发(C语言--联合体与枚举)

    目录 1.联合体 1.1定义共用体 1.2共用体占用的内存应足够存储共用体中最大的成员. 1.3联合变量任何时刻只有一个变量存在,最后一次赋值有效 1.4JNI头文件中的联合体 2.枚举 1.联合体 共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型.您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值.共用体提供了一种使用相同的内存位置的有效方式. 1.1定义共用体 为了定义共用体,您必须使用 union 语句,方式与定义结构类似.union 语句定义了一个新的

  • Android NDK开发(C语言字符串)

    目录 1.C语音的字符串有两种 1.1字符数组 1.2字符指针 2.字符串常用的方法 2.1strcpy字符串拼接 2.2strchr字符串中查找字符 2.3strchr字符串中查找字符 2.4更多用法... 1.C语音的字符串有两种 1.1字符数组 数组可以修改其中某一个值,不可以整体赋值. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <Windows.h&g

  • Android NDK开发(C语言基本数据类型)

    目录 1.C 语言包含的数据类型 2.C语言的基本数据类型 3.示例代码 1.C 语言包含的数据类型 如下图所示: 2.C语言的基本数据类型 short.int.long.char.float.double 这六个关键字代表C 语言里的六种基本数据类型. 格式化输出的时候: int %d short %d long %ld float %f double %lf char %c %x 十六进制 %o 八进制 %s 字符串 %p一般以十六进制整数方式输出指针的值,附加前缀0x 在32 位的系统上s

  • Android NDK开发(C语言-文件读写)

    目录 1.文件读写 1.1打开文件 1.2关闭文件 1.3读取文件 1.4写入文件 1.5读写二进制I/O文件 1.6获取文件的大小 1.7文本简单加密.解密 1.8二进制文件简单加解密 1.文件读写 一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节.C 语言不仅提供了访问顶层的函数,也提供了底层(OS)调用来处理存储设备上的文件. 1.1打开文件 我们可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FI

  • Android NDK开发简单程序分享(Hello Word!)

    在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力.这里我们选择使用C+JAVA开发Android程序,首先你必须了解C语言.JAVA语言以及Linux操作系统,这样可以帮助你开始上手,当然不是说你必须是大牛才能进行NDK开发,下面我们来一起实现一个简单的NDK程序. 第一步,创建Android工程 打开开发环境eclipse,在左侧空白区域,右键单击创建Android工程(非常简单,不再赘述)

  • Android NDK开发入门

    神秘的Android NDK开发往往众多程序员感到兴奋,但又不知它为何物,由于近期开发应用时,为了是开发的.apk文件不被他人解读(反编译),查阅了很多资料,其中有提到使用NDK开发,怀着好奇的心理,通过在线视频教育网站,我初步了解了NDK的神秘面纱,好东西自然要分享,接下来我们就一起来认识一下Android NDK开发. 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三

  • Android NDK开发详细介绍

    Android之NDK开发 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言.但这并不等同于"第三方应用只能使用Java".在Android SDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,"Java+C"的

  • Android编程开发之打开文件的Intent及使用方法

    本文实例讲述了Android编程开发之打开文件的Intent及使用方法.分享给大家供大家参考,具体如下: 在写文件管理系统时会用到各种打开不同格式的文件的需求,由于Android系统默认内置了一些可以打开的系统应用,但还是不能满足需求,比如打开视频文件.word等,需要安装相应的播放软件才可以使用,这时程序会通过Intent查找可以使用的软件实现通过代码打开一个文件需要2部分,一部分是要获取到不同文件的后缀,以便根据需求匹配相应的Intent,另一个就是不同格式的文件打开的Intent不同 1.

随机推荐