精华内容
下载资源
问答
  • 在对汉字进行操作的时候,我进行了一些字的实验,目前仅发现了一个王字,在取反后取反回去不能变成王字,我加了查看字符格式的代码,发现 王 这个字在进行第一次字符操作时候,被分解为三个字节!!!然后再操作,就...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼一般在屏幕上显示汉字的时候需要汉字系统的支持,但需要自己显示汉字的时候,就需要自己读汉字字库文件,把字符点阵读出来,再用绘图的办法显示到屏幕上,本文是读UCDOS...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    一般在屏幕上显示汉字的时候需要汉字系统的支持,但需要自己显示汉字的时候,就需要自己读汉字字库文件,把字符点阵读出来,再用绘图的办法显示到屏幕上,本文是读 UCDOS 16点字库文件的示例。

    在 UCDOS 的点阵字库 HZK16 中,字符点阵是按照汉字内码排列的,汉字的内码从一些图形字符开始,起始编码为 A1A1H,汉字内码第一位为区码,每区为 94 个汉字,第二位为每区内的编码,每个汉字的点阵为 16点*16点 共32字节,数据按第一行 1-8点,9-16点,第二行 1-8点,9-16点...排列,每位数据 1 为要显示点,0 为不显示点。汉字点阵数据在字库中的偏移量为 ((区码-A1H)*94 + (区内编码-A1H))*32。

    本程序为一个简单的例子,要显示的汉字在变量 DISP_DATA 中,且没有考虑汉字、英文混用的情况。

    源程序:

    ; Write in May 22,1996

    ;            By LuoYunBin ----- http://asm.yeah.net

    .286

    LINE_CHAREQU210;在屏幕上第几行显示

    COL_CHAREQU230;在屏幕上第几列显示

    COLOR_CHAREQU0EH;显示颜色

    CHARSEQU(offset disp_data_end-offset disp_data)/2

    CODESEGMENT

    ASSUME CS:CODE,DS:CODE

    ORG 100H

    START:

    jmpinstall

    CC_FILEDB'C:\UCDOS\HZK16',0;字库文件名,用 UCDOS 的16点阵汉字库

    HANDLEDW?;file handle

    DISP_DATADB'罗云彬';要显示的汉字

    DISP_DATA_ENDEQUTHIS BYTE

    D_OPEN_ERRORDB'File C:\UCDOS\HZK16 not found !',0dh,0ah,24h

    install:

    movax,3d00h;打开汉字库

    movdx,offset cc_file

    int21h

    jnbopen_ok

    movah,9

    movdx,offset d_open_error

    int21h

    int20h

    open_ok:

    movhandle,ax

    movsi,offset disp_data

    movdi,offset zi_buffer

    movcx,chars

    cld

    ins2:

    lodsb

    movah,al

    lodsb

    callget_dots;读出汉字点针

    loopins2

    calldisp_cc;显示到屏幕

    int20h

    GET_DOTSPROC

    pusha

    subax,0a1a1h;汉字的内码从 A1区开始

    cwd

    movdl,al;所以绝对开始区是内码-A1

    moval,ah;点阵在字库中的位置为

    cbw

    movbl,94;((汉字码1-A1)* 94 + 汉字码2 - A1)* 32

    mulbl

    addax,dx

    movbx,32

    mulbx

    movcx,dx

    movdx,ax

    movax,4200h;移动读写指针到点阵数据位置

    movbx,handle

    int21h

    movah,3fh

    movcx,32

    movdx,di

    int21h

    popa

    adddi,32

    ret

    GET_DOTSENDP

    DISP_CCPROC

    movax,12h;640*480 mode

    int10h;设置640*480/16色显示模式

    movcx,chars

    movsi,offset zi_buffer

    movbx,col_char-20;BX = column

    dh_lop0:

    addbx,20;every char column+20

    pushcx

    movcx,16;l6 lines/char

    movdx,line_char;DX = start line

    dh_lop1:

    pushbx

    pushcx

    lodsb;16 dots/line

    movah,al

    lodsb

    movcx,16

    dh_lop2:

    shlax,1

    pushax

    pushbx

    pushcx

    jcdb_color

    xoral,al;back color is 0

    jmpshort db_draw

    db_color:

    moval,color_char

    db_draw:

    movah,0ch

    movcx,bx

    xorbh,bh

    int10h

    popcx

    popbx

    popax

    incbx;inc column

    loopdh_lop2

    incdx;next line

    popcx

    popbx

    loopdh_lop1

    popcx

    loopdh_lop0

    xorah,ah

    int16h

    movax,3

    int10h

    ret

    DISP_CCENDP

    ZI_BUFFEREQUTHIS BYTE

    CODEENDS

    END START

    展开全文
  • c语言文件读写操作的详细使用方法C文件操作遇到的状况1.将一个文件读到另一个文件,用“(ch = getc(fp)) != EOF”来判断文件是否结束,如果文件是全英文文本的话绝对没问题,新文件的大小和原文件大小一样;但是如果...

    c语言文件读写操作的详细使用方法

    C文件操作遇到的状况

    1.将一个文件读到另一个文件,用“(ch = getc(fp)) != EOF”来判断文件是否结束,如果

    文件是全英文文本的话绝对没问题,新文件的大小和原文件大小一样;但是如果是一些有中

    文字符或者是二进制文件,原文件没读完就结束。

    2.将一个文件读到另一个文件,用“!feof(fp)”判断文件是否结束,不管原文件是什么类型

    的都可以将原文件全部读完才结束,但是新文件的大小比原文件多了一个字节。

    问题:在C里如何才能正确判断文件结束??

    探索

    测试一,我写了一个函数来试用EOF判断文件结束的情况:

    -------in.txt内容如下---------

    abcde

    -------in.txt结束-------------

    -------test1.c----------------

    int main(int argc, char* argv[]){

    char ch;

    FILE* in;

    FILE* out;

    in = fopen("in.txt", "rb");  /* in.txt全为英文字符 */

    out = fopen("out.txt", "wb");

    while ((ch = getc(in)) != EOF){

    putc(ch, out);

    }

    }

    运行后结果是:out.txt的大小和in.txt的大小完全一样。

    然后修改in.txt如下,在原来的基础上加入一些中文:

    -------in.txt修改后的内容如下---------

    abcde

    这是一个测试文件

    测试中文字符

    -------in.txt结束--------------------

    运行后记过也是大小是一样的。将源程序中的“in = fopen("in.txt", "rb"); out =

    fopen("out.txt", "w");”改为“in = fopen("in.rar", "rb"); out = fopen("out.rar",

    "wb");”,其中,in.rar是一个压缩包文件,大小有4M多,运行程序后,得到的out.rar 文

    件只有800多k,双击解压也出现错误,无法解压。

    结论1:在C里,操作文件的时候,如果打开方式是“r”或者“w”,是以文本形式打开,也

    就是读如内存的字符值都是0-256之间,不可能出现-1,所以用EOF来判断是可以的,但是

    如果以“rb”或者“wb”方式打开,以二进制读入内存或者写入文件,出现负数是可能的,

    所以用EOF来判断不能将文件读完就已经结束了。之所以在上面测试中有中文的in.txt文件没

    有出错,是因为在这个文中的中文恰好没有一个的二进制码是-1的;在后来的.rar测试中,

    就是读到800多K时就遇到了-1,所以文件结束。

    测试二,修改test1.c为test2.c

    -------test2.c----------------

    int main(int argc, char* argv[]){

    FILE* in;

    FILE* out;

    in = fopen("in.txt", "rb");

    out = fopen("out.txt", "wb");

    while (!feof(in)){

    putc(getc(in), out);

    }

    }

    不管是什么方式打开,打开什么文件,都能把原文件完全读到新文件中,不过在新文件的末

    尾多了一个奇怪的字符(y上面多两点,其二进制值是-1)。

    在读in.rar的时候,我把循环该成了永真循环,执行后用CTR+Z结束,out.rar大小为11M,比

    in.rar(4.2M)大了一倍多,但是我打开out.rar可以解压,而且解压出来的文件跟in.rar解

    压出的文件的大小是一样的。用UtralEdit打开out.rar发现从某一个时候开始,后面的所有

    二进制都是‘FF’(即-1),顿时明白out.rar比in.rar大的那部分其实全是-1。

    结论2:在C里-1被定义成是文件结束符,所以在文件末尾多余的-1都不会影响文件的使用

    测试三,根据第二得到的结论,我想那如果一开始读第一个字符的时候就读到-1(文件结束

    符)会怎么样呢?我又做了测试,

    -------test3.c----------------

    int main(int argc, char* argv[]){

    char ch= -1;

    FILE* in;

    in = fopen("in.txt", "wb");

    putc(ch, in);

    }

    然后又用记事本打开in.txt,在那个奇怪的字符(y上面多两点,其二进制值是-1)后面自

    己加了一些英文字符。分别用test1.c和test2.c进行试验,test1中新文件没有内容;test2

    全部都能读到新文件中,只不过test2中的新文件后面仍让有那个奇怪字符(y上面多两点,

    其二进制值是-1)。很奇怪阿,如果-1是文件结束符的话,应该在读第一个字符的时候就

    停止了阿,怎么还能把-1后面的字符都读到新文件中呢?又查阅了资料,自己猜想结论如下

    :虽然-1在C里被定义成文件结束符(EOF),但并不是说文件里出现了-1就表示文件结束

    ,其实文件结束时候的-1是系统在读到文件结束时候返回的一个值,而不是说系统读到-1

    就知道文件结束(不知道有没有把我的意思描述清楚),简言之就是系统现知道文件结束了

    才返回-1,而不是先读到-1才知道文件结束。所以,在文件中出现的-1并不是说文件结束

    ,只有当真正文件指针指向文件结尾的时候系统返回的那个-1才表示文件结束。之所以在

    test1中不能读是因为EOF=-1,用读出来的-1跟EOF比较肯定是真的。(这个部分很难描述

    ,大家可以去实际试验下,有什么问题欢迎讨论。)

    第四,用fread()函数来判断文件结束:

    -------test4.c----------------

    int main(int argc, char* argv[]){

    char ch;

    FILE* in;

    FILE* out;

    in = fopen("in.txt", "rb");

    out = fopen("out.txt", "wb");

    while (fread(&ch, sizeof(char), 1, in) == 1){

    putc(ch, out);

    }

    }

    好了,下面我们一个个实例看关于c语方文件读写操作实例

    C++文件流:

    fstream  // 文件流

    ifstream  // 输入文件流

    ofstream  // 输出文件流

    //创建一个文本文件并写入信息

    //同向屏幕上输出信息一样将信息输出至文件

    #include#includevoid main()

    {

    ofstream f1(“d:me.txt”);           //打开文件用于写,若文件不存在

    就创建它

    if(!f1)return;                 //打开文件失败则结束运行

    f1<

    f1<

    f1.close();                   //关闭文件

    }

    运行后打开文件d:me.txt,其内容如下:

    姓名:廉东方

    家庭地址:河南郑州

    文件操作:

    打开文件

    文件名

    注意路径名中的斜杠要双写,如:

    “D:MyFilesReadMe.txt”

    文件打开方式选项:

    ios::in    = 0×01, //供读,文件不存在则创建(ifstream默认的打开方式)

    ios::out    = 0×02, //供写,文件不存在则创建,若文件已存在则清空原内容

    (ofstream默认的打开方式)

    ios::ate    = 0×04, //文件打开时,指针在文件最后。可改变指针的位置,常和in、

    out联合使用

    ios::app    = 0×08, //供写,文件不存在则创建,若文件已存在则在原文件内容后写

    入新的内容,指针位置总在最后

    ios::trunc   = 0×10, //在读写前先将文件长度截断为0(默认)

    ios::nocreate = 0×20, //文件不存在时产生错误,常和in或app联合使用

    ios::noreplace = 0×40, //文件存在时产生错误,常和out联合使用

    ios::binary  = 0×80  //二进制格式文件

    文件保护方式选择项:

    filebuf::openprot;   //默认的兼容共享方式

    filebuf::sh_none;    //独占,不共享

    filebuf::sh_read;    //读共享

    filebuf::sh_write;   //写共享

    打开文件的方法

    调用构造函数时指定文件名和打开模式

    ifstream f(“d:12.txt”,ios::nocreate);         //默认以 ios::in 的方式

    打开文件,文件不存在时操作失败

    ofstream f(“d:12.txt”);                //默认以 ios::out的方式

    打开文件

    fstream f(“d:12.dat”,ios::in|ios::out|ios::binary); //以读写方式打开二进制

    文件

    使用Open成员函数

    fstream f;

    f.open(“d:12.txt”,ios::out);             //利用同一对象对多个文

    件进行操作时要用到open函数

    检查是否成功打开

    成功:

    if(f){…}       //对ifstream、ofstream对象可用,fstream对象不可用。

    if(f.good()){…}

    失败:

    if(!f){…}       // !运算符已经重载

    if(f.fail()){…}

    读写操作

    使用<>运算符

    只能进行文本文件的读写操作,用于二进制文件可能会产生错误。

    使用函数成员 get、put、read、write等

    经常和read配合使用的函数是gcount(),用来获得实际读取的字节数。

    读写二进制文件注意事项

    打开方式中必须指定ios::binary,否则读写会出错

    用readwrite进行读写操作,而不能使用插入、提取运算符进行操作,否则会出错。

    使用eof()函数检测文件是否读结束,使用gcount()获得实际读取的字节数

    关闭文件

    使用成员函数close,如:

    f.close();

    利用析构函数

    对象生命期结束时会检查文件是否关闭,对没有关闭的文件进行关闭操作。

    随机读写文件

    通过移动文件读写指针,可在文件指定位置进行读写。

    seekg(绝对位置);      //绝对移动,    //输入流操作

    seekg(相对位置,参照位置);  //相对操作

    tellg();          //返回当前指针位置

    seekp(绝对位置);      //绝对移动,    //输出流操作

    seekp(相对位置,参照位置);  //相对操作

    tellp();          //返回当前指针位置

    参照位置:

    ios::beg  = 0       //相对于文件头

    ios::cur  = 1       //相对于当前位置

    ios::end  = 2       //相对于文件尾

    读写文本文件的示例

    //为能够正确读出写入文件的各数据,各数据间最好要有分隔

    #includevoid main()

    {

    fstream f(“d:try.txt”,ios::out);

    f<<1234<

    f.close();

    f.open(“d:try.txt”,ios::in);

    int i;

    double d;

    char c;

    char s[20];

    f>>i>>d>>c;               //读取数据

    f.getline(s,20);

    cout<

    cout<

    cout<

    cout<

    f.close();

    }

    运行结果:

    1234

    3.14

    A

    How are you

    Press any key to continue

    显示文本文件的内容

    //使用get()一次读一个字符——————————–方案一

    #includevoid main()

    {

    ifstream fin(“d:简介.txt”,ios::nocreate);

    if(!fin){

    cout<

    return;

    }

    char c;

    while((c=fin.get())!=EOF)cout<

    fin.close();

    }

    //使用get(char *,int n,char delim=’n’)一次读多个字符—-方案二

    //巧妙利用文本文件中不会有字符’

    展开全文
  • C语言文件读写

    2020-12-24 14:55:51
    文章目录前言一、文件的打开(fopen函数)二、文件关闭(fclose函数)三、C中文文件和二进制文件的区别四、C语言以字符形式读写文件五、C语言以字符串形式读写文件六、C语言中的文件复制操作七、C语言文件常用的...


    前言

    提示:在C语言中,文件操作都是由库函数来完成的,下面总结下文件的相关操作。

    一、文件的打开(fopen函数)

    fopen()函数用来打开一个文件,它的格式为:

    FILE *fopen(char *filename,char *type);
    

    filename为文件名(包括文件路径),type为打开方式,它们都是字符串。fopen() 会获取文件信息,包括文件名、文件状态、当前读写位置等,并将这些信息保存到一个FILE类型的结构体变量中,然后将该变量的地址返回。如果接收 fopen() 的返回值,就需要定义一个 FILE 类型的指针。例如:

    FILE *fp = ("demo.txt", "r");
    
    打开方式(type)如表格所示:
    
    类型详解
    “r”(只读)为输入打开一个文本文件
    “w”(只写)为输出打开一个文本文件
    “a”(追加)为追加打开一个文本文件
    “rb”(只读)为输入打开一个二进制文件
    “wb”(只写)为输出打开一个二进制文件
    “ab”(追加)为追加打开一个二进制文件
    “r+”(读写)为读/写打开一个文本文件
    “w+”(读写)为读/写创建一个文本文件
    “a+”(读写)为读/写打开一个文本文件
    “rb+”(读写)为读/写打开一个二进制文件
    “ wb+”(读写)为读/写创建一个二进制文件
    “ab+”(读写)为读/写打开一个二进制文件

    在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。
    代码如下(示例):

    FILE *fp = NULL;
    if(fp = fopen("D:\\test.txt","rb") == NULL) //判断打开的文件是否为空,如果为空,则提示错误
    {
    	printf("open file is error D:\\test.txt file!\n");
    	exit(1);
    }
    

    二、文件关闭(fclose函数)

    代码如下(示例):

    if(fclose(fp) == 0)     //文件关闭,如果成功则返回值为0,返回值为非0表示关闭错误
    {
        printf("close fp success\n");
    }
    else
    {
        printf("close fp fail\n");
    }
    

    三、C中文本文件和二进制文件的区别

    二进制是按照二进制编码方式存放在文件中的,虽然可以在屏幕上显示,但是不能读懂,文本文件是ASC码,可以在屏幕上按字符显示。

    四、C语言以字符形式读写文件

    以字符形式读写文件时,每次可以从文件中读取一个字符,或者向文件中写入一个字符。主要使用两个函数:fgetc()和fputc()。fgetc 是 file get char 的缩写,意思是从指定的文件中读取一个字符。它的原型为:

    int fgetc (FILE *fp); //fp 为文件指针。
    

    fgetc() 读取成功时返回读取到的字符,读取到文件末尾或读取失败时返回EOF。EOF 是 end of file 的缩写,表示文件末尾,是在 stdio.h 中定义的宏,它的值是一个负数,往往是 -1。EOF 不绝对是 -1,也可以是其他负数,这要看编译器的实现。
    代码如下(示例):

    char ch;
    while( (ch=fgetc(fp)) != EOF )  //每次读取一个字节,直到读取完毕
    putchar(ch);                    //输出字符ch的值
    fputc('a', fp);                 //想文本中输入字符a
    

    EOF 本来表示文件末尾,意味着读取结束,但是很多函数在读取出错时也返回 EOF,那么当返回EOF时,到底是文件读取完毕了还是读取出错了?我们可以借助 stdio.h 中的两个函数来判断,分别是 feof() 和 ferror()。

    // feof() 函数用来判断文件内部指针是否指向了文件末尾,它的原型是:
    int feof ( FILE * fp ); //当指向文件末尾时返回非零值,否则返回零值。
    // ferror() 函数用来判断文件操作是否出错,它的原型是:
    int ferror ( FILE *fp ); //出错时返回非零值,否则返回零值。
    

    五、C语言以字符串形式读写文件

    fgets() 函数用来从指定的文件中读取一个字符串,并保存到字符数组中,它的原型为:

    char *fgets ( char *str, int n, FILE *fp ); //str 为字符数组,n 为要读取的字符数目,fp 为文件指针。
    

    返回值:读取成功时返回字符数组首地址,也即 str;读取失败时返回 NULL;如果开始读取时文件内部指针已经指向了文件末尾,那么将读取不到任何字符,也返回 NULL。读取到的字符串会在末尾自动添加 ‘\0’,n 个字符也包括 ‘\0’。也就是说,实际只读取到了 n-1 个字符,如果希望读取 100 个字符,n 的值应该为 101。
    代码如下(示例):

    char str[N];
    while(fgets(str, N, fp) !=NULL)
    {
    	printf("str = %s",str);
    }
    

    六、C语言中的文件复制操作

    #define N 101
    FILE *wfp = NULL;
    FILE *rfp = NULL;
    if((wfp = fopen("D:\\test1.jpg","wb")) == NULL) //判断打开的文件是否为空
    {
    	printf("open file is error D:\\test.txt file!");
    	exit(1);
    }
    if((rfp = fopen("D:\\1.jpg","rb")) == NULL) //判断打开的文件是否为空
    {
    	printf("open file is error D:\\test.txt file!");
    	exit(1);
    }
    char buf[N]; //定义一个buf,作为缓存区
    int len = 0; //读取的长度
    while((len = fread(buf,sizeof(char),N,rfp))!=0)
    {
    	fwrite(buf,sizeof(char),len,wfp);
    }
    fclose(wfp);
    fclose(rfp);
    

    七、C语言中文件常用的函数

    fseek(fp,0,SEEK_END);   //SEEK_END文件末尾,0偏移量.
    fseek(fp,0,SEEK_SET);   //SEEK_END文件头,0偏移量.
    long filesize = ftell(fp); //返回当前的文件指针,相对于文件开头的位移量.
    int ret = fprintf(fp,"%s","测试");//将文件格式化方式写入到文件中,成功返回字符串长度,错误返回负数.
    int ret = feof(fp);//判断是否到文件尾部,如果是返回一个正数,不是返回0.
    int ret = fflush(fp); //刷新文件缓存区,如果返回0,则表示成功,EOF表示失败,错误在error中.
    rewind(fp);//设置文件流位置为开头,和fseek()一样.
    long int ftell(FILE *stream);返回文件当前的位置
    

    八 、文件加解密

    通过字符串++和减减实现字符的加密和解密

    void encrypt(char *s)   //文件加密
    {
        while(*s)
        {
            (*s)++;
            s++;
        }
    }
    void disencrypt(char *s)    //文件解密
    {
        while(*s)
        {
            (*s)--;
            s++;
        }
    }
    

    九、文件的重命名和删除

    remove("E:\\Study\\program\\QT\\file\\a.txt");//删除文件a.txt
    rename("E:\\Study\\program\\QT\\file\\b.txt","E:\\Study\\program\\QT\\file\\a.txt");//重命名b.txt为a.txt
    

    总结

    1、读取文件文本和写入文件文本应该分开封装,如果文件打开后,写入文件,然后在读取文件,很容易出现问题(如果写入文件长度为4,但是读取长度为8,则文件后面会追加4个空格)。 2、在windows下,文本文件打开文件\n换行,会自动在前面加入\r,但是二进制打开不会。 3、在使用fread读取文件,并且显示时,一次读取的大小要小于buf的定义的大小,不然,会出现越界,不能自动追加'\0'结尾,但是如果是文件复制,则可以。
    展开全文
  • C语言文件读写函数总结

    千次阅读 多人点赞 2018-04-30 23:51:59
    2、从文件读取字符 fgetc 二、字符串的读写 1、字符串写入文件函数 fputs 2、从文件读取字符 fgets 三、块数据读写 1、向文件中写入块数据fwrite 2、从文件读取块数据fread 四、格式化读写 1、格式化...

    一、字符读写

    1、字符写入文件函数 fputc

    fputc函数的原型如下:
    
        int fputc( int c, FILE *fp );
    
    参数说明:
        其中,c是要写入的字节,它虽被定义为整型,但只使用最低位的一字节,fp是文件指针。
    
    fputc的功能:
        将字节c输出至fp所指向的文件。如果成功,位置指针自动后 移1字节的位置,并且返回c;否则返回EOF。
    

     

    2、从文件中读取字符 fgetc

    fgetc函数的原型如下:
    
        int fgetc( FILE *fp );
    
    参数说明:
        其中fp为文件指针。
    
    fgetc的功能:
        从fp所指向的文件中读取一个字节,如果成功则返回读取的字节,位置指针自动后移1字节的位置;否则返回EOF。

     

    二、字符串的读写

    1、字符串写入文件函数 fputs

    fputs函数的原型如下:
    
        int fputs( const char *s, FILE *fp );
    
    参数说明:
        其中,s是要写入的字符串,fp是文件指针。
    
    fputs的功能:
        将字符串s输出至fp所指向的文件(不含'\0')。如果成功,位置指针自动后移,函数返回一个非负整数;否则返回EOF。

     

    2、从文件中读取字符 fgets

    fgets函数的原型如下:
    
        char *fgets( char *s, int n, FILE *fp );
    
    参数说明:
        其中,s指向待赋值字符串的首地址,n是控制读取个数的参数,fp为文件指针。 
    
    fgets的功能:
        从位置指针开始读取 一行或n-1个字符,并存入s,存储时自动在字符串结尾加上'\0'。如果函数执行成功,位置指针自动后移,
    并返回s的值,否则返回NULL。

     

    三、块数据读写

    所谓块读写,就是读写n块以m个字节为单位的二进制数据,可以是一个字符(一个字符为一字节,则块大小为1*1),可以是一个长度为n字符串(块大小1*n),可以是长度为n的整型数组(整型以4字节算,块大小4*n),也可以是结构体等任意数据类型,并没有什么限制。

    1、向文件中写入块数据fwrite

    fwrite函数的原型如下:
    
        size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp );
    
    参数说明:
        ptr:指向保存读写数据的内存的指针,它可以指向数组、变量、结构体等。
        size:表示每个数据块的字节数。
        count:表示要读写的数据块的块数。
        fp:表示文件指针。
        理论上,每次读写 size*count 个字节的数据。
    
    fwrite的功能:
        从内存中的ptr指向的地址开始,将连续n*size字节的内容写入fp文件中。该函数的返回值是实际写入的数据块个数。

     

    2、从文件中读取块数据fread

    fread函数的原型如下:
    
        size_t fread ( void *ptr, size_t size, size_t count, FILE *fp );
    //size_t 是在 stddef.h 头文件中使用 typedef 定义的数据类型,表示无符号整数,也即非负数,常用来表示数量。
    
    参数说明:
        见fwrite
    
    fread的功能:
        从文件fp中,连续读取n*size字节的内容,并存入ptr指向的内存空间。该函数的返回值是实际读入的数据块个数。

     

    四、格式化读写

    格式化读写函数包括fprintf和fscanf两个函数,它们只用于文本文件的读写,不能用于二进制文件的读写。文本文件与二进制文件的区别下面注意点中有介绍。

    1、格式化写入文件fprintf

    fprintf函数的原型如下:
    
        int fprintf( FILE *fp, const char* format, 输出参数1, 输出参数2… );
    
    参数说明:
        其中,fp是文件指针,format为格式控制字符串,输出参数列表为待输出的数据。 
    
    fprintf的功能:
        根据指定的格式(format参数)发送数据(输出参数)到文件fp。

    例:

    #include <stdio.h>
      
    int main()
    {
        FILE *fp;
        fp = fopen("a.txt","w");
        int a = 10;
        double f = 11.11;
        fprintf(fp, "%d%lf", a, f);
        fclose(fp);
        return 0;
    }
    
    注意:fprintf()按格式输入到流,其用法和printf()相同,不过不是写到控制台,而是写到流罢了。注意的是
    返回值为此次操作写入到文件的字节数。如int c =fprintf(fp, "%s %s %d %f", str1,str2, a, b) ;
    假设str1:10字节;str2:10字节;a:2字节;b:8字节;则最终c为33,因为写入时不同的数据间自动加入一个空格。

     

    2、从文件中格式化读取fscanf

    fscanf函数的原型如下:
    
        int fscanf( FILE *fp,  const char* format, 地址1,地址2… );
    
    函数说明:
        其中,fp是文件指针,format为格式控制字符串,地址列表为输入数据的存放地址。 
    
    fscanf的功能:
        根据指定的格式(format参数)从文件fp中读取数据至内存(地址)。

    例:

    #include <stdio.h>
      
    int main()
    {
        FILE *fp;   
        fp = fopen("a.txt","r"); //需要创建a.txt文件,然后写入两个数据,空格隔开
        int i=0;
        double f=0;
        fscanf( fp, "%d%lf", &i, &f );
        fclose(fp);
        printf("%d\n%lf\n",i,f);
        return 0;
    }
    

    五、一些注意点

    (上面的都是网上抄的,下面的是我自己总结的,大佬们有砖的话轻点拍)

    1、fputc和fgetc注意点

    fputc 每次只能存一个字节,如果将整型、浮点型等数据类型入文件(因为整型浮点型每个数据都需要好几个字节,由于平台不同不固定,具体自己查不列出),就会造成数据只截取最后一个字节导致数据出错;同理fgetc每次也只能读取一个字节。这时用 fprintf 和 fscanf 函数格式化读写比较合适。

    fgetc 每次调用只能获取一个字节,如果是中文字符,utf8 编码会占用三个字节,因此要用 fgets 来读取。当然你不嫌累也可以用 fgetc 读三次,然后拼成一个中文字符。

     

    2、fputs和fgets注意点

    fgets 有局限性,每次最多只能从文件中读取一行内容,因为 fgets 遇到换行符就结束读取。如果希望读取多行内容,需要使用 fread 函数;相应地写入函数为 fwrite。

     

    3、fwrite和fread注意点

    fwrite和fread直接读写二进制文本。

    Ⅰ、这里有人可能有疑问,二进制文件和文本文件有什么区别?

    参考:

    1、https://www.zhihu.com/question/19971994

    2、https://www.cnblogs.com/zhangjiankun/archive/2011/11/27/2265184.html

            直观上的区别是:文本文件打开后我们可以看懂,而二进制文件打开会是一堆“乱码”。但是,其实所有的文件在计算机中都是二进制,导致“乱码”是因为编码上不同。

            举个例子,比如在代码中的整型数65,用fwrite方式写入文件,我们打开文件时就会惊奇的发现,文件中并不是65,而是一个大写的 'A' 。而我们用fprintf却不会出现这个问题,65还是65。这是为什么呢?

            因为fwrite是直接将数据65写进了文件,而fprintf是将65拆成两个字符,‘6’和‘5’,‘6’和‘5’在ASCII编码表中分别是54和53,于是将54和53写进文件。写进文件后我们再来看打开文件时发生了什么?

            文件软件首先将文件中的数据读进内存,然后再将内存中的数据根据这个文本软件设置的编码格式(比如utf-8)进行解码。来看fwrite写入的文件,文件软件读到 '65' 后去编码表中找到对应数据,是 'A' 然后就将 'A' 输出到屏幕上;再看用fprintf写入的文件,文件软件读到 '54' 和 '53' 后去编码表中找到对应数据,是 '6' 和 '5' ,因此最终我们在屏幕上看到的是65。

            更详细的解释去看我发的参考链接,可能讲的更清楚。

    注:上面直观上的区别说法不是很准确。当读写采用不同编码表时就会产生乱码,比如你是以utf-8格式写入文件,然后将文件软件换个编码格式,比如 "GB2312" ,这时再打开也会是乱码,根本原因是相同的字符在不同编码中的编号是不同的,比如 "你" 字,"utf-8" 中的编码为e4 bd a0,而在 "GB2312" 中的编码为 c4 e3,你用e4 bd a0在 "GB2312" 为编码下打开,就会在 "GB2312" 中去找对应的字符,那么当然不会是 "你" 字了,也就会产生乱码。

     

    Ⅱ、fopen函数中以文本方式与二进制方式打开文件的区别

    参考:https://blog.csdn.net/recsysml/article/details/44195793

    a、Windows平台下 
    如果以“文本”方式打开文件,当读取文件的时候,系统会将所有的"/r/n"转换成"/n";当写入文件的时候,系统会将"/n"转换成"/r/n"写入。 
    如果以"二进制"方式打开文件,则读/写都不会进行这样的转换。 

    b、在Unix/Linux平台下

    “文本”与“二进制”模式没有区别。

    读写二进制文件,在fopen函数中mode的参数要加上“b”,用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux下会忽略该字符。

     

    Ⅲ、了解了文本方式与二进制方式区别我们来总结一下分别是哪些函数使用

    a、文本方式读写:fprintf/fscanf

    b、二进制方式读写:fgetc/fputc、fgets/fputs、fread/fwrite

     

    另:fwrite/fread与write/read的区别:

    https://blog.csdn.net/ljlstart/article/details/49535005

     

    4、fprintf和fscanf注意点

    fscanf将读取的ascii码转换成二进制放到内存中,效率略低;fgetc fputc 都是按照字节存取,无论文本模式还是二进制模式打开,都按照一个一个字节读取,不存在\r\n问题。

    还有一点是很多网站中文转utf-8的编码转换,utf-8编码是错的,它上面其实显示出来的是unicode编码,把我搞混好长时间。

     

     

    六、代码实例

    附上我的测试实例,有空的话自己打开一个个开关,编译运行看是否符合自己预期

    #include <stdio.h>
    #include <string.h>
    
    typedef struct 
    {
        char str1[6];
        char str2[6];
        char str3[6];    
    }STRS;
    
    
    int main()
    {
        FILE *fp;
        /*
         * fputc
         */
    
    #if 0
        fp = fopen("a.txt","w");
        //char a[3] = "你";
        //fputc(a[0],fp);
        //fputc(a[1],fp);
        //fputc(a[2],fp);
        int a=33;
        fputc(a,fp);
        fclose(fp);
    #endif
    
        /*
         * fgetc
         */
    
    #if 0 
        fp = fopen("a.txt","r");
        char c1 = fgetc(fp);
        char c2 = fgetc(fp);
        fclose(fp);
        printf("%c\n%c\n",c1,c2);
    #endif
    
        /*
         * fputs
         */
        
    #if 0
        fp = fopen("b.txt","w");
        char *s = "你好";
        fputs(s, fp);
        fclose(fp);
    #endif
    
        /*
         * fgets
         */
    
    #if 0
        fp = fopen("b.txt","r");
        STRS Strs;
        STRS *strs = &Strs;
    	    
        char hello1[6] = "hello";
        char hello3[6] = {'n','i','h','a','o'};
     
        memset(strs->str1,0,6);
        memcpy(strs->str1,hello1,6);
        memset(strs->str3,0,6);
        memcpy(strs->str3,hello3,6);
        //注意1:fgetc只能获取一位char字符,如果是中文字符,需要占三位char字符,因此要用fgets来读取;
        //注意2:读取的数据的长度要小于等于字符数组长度-1,因为字符串最后要存放'\0'。例如现在str2的长度为6,就会导致strs->str2最后不能加上‘\0’,从而会越界,连带输出str3,最终输出你好hello
        memset(strs->str2,0,6);
        fgets(strs->str2,7,fp);
        
        memset(strs->str3,0,6);
        memcpy(strs->str3,hello3,6);
        
        printf("%s\n",strs->str2);
        fclose(fp);
    #endif
    
        /*
         * fprintf
         */
    
    #if 0
        fp = fopen("c.txt","w");
        int b = 65;
        //double f = 1.11;
        //char s[3] = "你";
        //fprintf(fp, "%s", s);
        fprintf(fp, "%d", b);
        //fprintf(fp, "%d %lf", a, f);
        fclose(fp);
    #endif
    
        /*
         * fscanf
         */
    
    #if 0
        fp = fopen("c.txt","r+"); //需要创建a.txt文件,然后写入两个数据,空格隔开
        //int i=0;
        //double f=0;
        //fscanf( fp, "%d%lf", &i, &f );
        //printf("%d\n%lf\n",i,f);
        char c;
        fscanf( fp, "%c", &c);
        printf("%c\n",c);
        fclose(fp);
        
        fp = fopen("c.txt","r+");
        int fscanf_int;
        fscanf( fp, "%d", &fscanf_int );
        printf("%d",fscanf_int);
        fclose(fp);
    #endif
    #if 0
        fp = fopen("e.txt","r");
        double a = 0;
        fscanf( fp, "%lf", &a);
        fclose(fp);
        printf("%lf\n",a);
    #endif
         
        /*
         * fwrite
         */
        
    #if 0
        fp = fopen("e.txt","wb");
        //char array[3] = "你";
        //fwrite(array, sizeof(char), 3, fp);
        //double array[3] = {1.11, 2.22, 3.33};
        //fwrite(array, sizeof(double), 3, fp);
        //double a = 3.14159;
        //fwrite(&a, sizeof(double), 1, fp);
        char a=65;
        fwrite(&a, sizeof(char), 1, fp);
        fclose(fp);
    #endif
    
        /*
         * fread
         */
        
        /*
        fp = fopen("e.txt","rb");
        double array[3];
        fread(array, sizeof(double), 3,fp);
        fclose(fp);
        for(int i=0;i<3;i++)
        {
    	printf("%lf\n",array[i]);
        }
        */
    
        return 0;
    }

     

    展开全文
  • 了解了在C语言中如何打开文件后就可以正式进行文件读写操作了,文件根据类型又分为ASCII文件和二进制文件,我们首先从简单的入手,先看看ASCII文件(文本文件)是如何读取的。ASCII文件(文本文件)中保存的是一个字符...
  • c语言文件读写

    2017-12-01 14:40:48
    //获取文件的指针char *pBuf; //定义文件指针fseek(pFile,0,SEEK_END); //把指针移动到文件的结尾 ,获取文件长度int len=ftell(pFile); //获取文件长度pBuf=new char[len+1]; //定义数组长度rewind(pFile); //把...
  • C语言文件读写操作详解

    千次阅读 2016-03-24 14:28:35
    C语言/C++中文帮助文档免积分下载(点击跳转) 当文件按指定的工作方式打开以后,就可以执行对文件的读和写。下面按文件的性质分类进行操作。针对文本文件和二进制文件的不同性质,对文本文件来说,可按字符读写...
  • 按照要求写了个读文件的程序,但是出了一点我不能理解的bug 希望老师指点指点 程序: ``` int main () { char comet[6]; char group[6]; FILE *input; input=fopen ("ride.in", "r"); ...
  • C语言文件读写操作

    2019-08-14 18:06:30
    1.文件的打开操作:fopen打开一个文件 FILE *fopen(char *pname,char *mode) 功能说明  按照mode 规定的方式,打开由pname指定的文件。若找不到由pname指定的相应文件,就按以下方式之一处理...
  • C语言fputc()函数:写文件函数(将一指定字符写入文件流中) 头文件: #include 定义函数: int fputc(int c, FILE * stream); 函数说明:fputc 会将参数c 转为unsigned char 后写入参数...
  • C语言读取中文汉字

    万次阅读 2018-08-05 11:48:33
    一般的来说,一个汉字占两个字节,数字和字母都占一个字节,但是有一点是,汉字的两个字节如果转换成整型都是负数,也就是说,用按字节读取文件,然后判断字节的正负,如果一个字节对应的整型是负的,那么一连读取两...
  • 按照此链接进行操作,已解决
  • C语言文件输入输出读取中文TXT文件出现乱码

    万次阅读 多人点赞 2018-03-17 19:18:37
    今天在实现一个倒序输出文件的程序时测试了英文数字和中文,唯独中文出现了乱码,源码如下//倒序显示文件的内容 #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #define CNTL_Z '\032' //文件...
  • C语言读取汉字文件,找出汉字信息的示例,汉字文件后缀为.FON
  • C语言文件相关函数主要有以下几种: FILE* fopen(char* filepath, char* mode); 打开文件函数,传入文件地址和打开模式文件打开模式包括 "r" 读取 ,"w" 写入模式,将现有文件清空。如果不存在则创建文件 ,"a" ...
  • 作者:海子 出处:http://www.cnblogs.com/dolphin0520/C语言文件操作解析(五)之EOF解析在C语言中,有个符号大家都应该很熟悉,那就是EOF(End of File),即文件结束符。但是很多时候对这个理解并不是很清楚,导致在...
  • C语言文件详解 引入: 主要文件操作包括以下函数: 打开文件 关闭所有打开的文件并结束程序 从文件指针指向的文件流中读取一个字符 将指定字符写到文件指针所指向的当前位置上 关闭文件流释放文件指针 fopen...
  • C语言文件读取和写入

    千次阅读 2019-11-09 16:32:28
    1、C语言中写文件 //获取文件指针 FILE *pFile = fopen("1.txt", //打开文件的名称 "w"); // 文件打开方式 如果原来有内容也会销毁 //向文件写数据 fwrite ("hello", //要输入的文字 1,//文字每一项的大小 以为...
  • C语言操作EXCEL文件(读写)本文主要介绍通过纯C语言进行EXCEL的读写操作:(修改时间2018.08.28,如果运行结果均是0,请看文章最后一节)C语言读操作C语言写操作在之前需要使用C语言读取Excel文件内容的功能,查阅了很...
  • C语言文件获取中文乱码问题

    千次阅读 热门讨论 2020-04-17 18:27:30
    文件编码设置为ANSI即可解决,我遇到的是这样的。
  • 在项目里面经常会用到读取一些配置信息,而C语言有没有直接的读取配置文件的函数,这里贴出我写的代码,有兴趣的看一下,也希望能有好的建议。考虑到代码需要在多个项目里面运行,会对配置文件有不同的需求,这里把...
  • C语言文件

    2019-11-18 13:07:28
    c语言中的文件 在操作系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。 通常把显示器称为标准输出文件,printf 就是向这个文件输出,把键盘称为标准输入文件,scanf 就是从这个...
  • C语言文件遍历及读写

    2016-10-22 13:31:00
    c语言中遍历文件或者文件夹,系统提供的dirent和DIR结构体中包含了文件的很多信息 struct dirent 结构 struct dirent { long d_ino; /* inode number 索引节点号 */ off_t d_off; /* offset to this ...
  • while (!feof(filepoint)) { m = 0; for (i = 0;i <... 此处ch读进来的是中文,我从调试看到ch='?...我想读取一个文件,跳过里面的所有中文内容,将里面的英文单词一行一行地输出!!! 真的是跪求!
  • c语言文件录入与读取

    千次阅读 2018-12-31 21:55:45
    目录 文件打开 文件信息写/读 文件关闭 文件打开 打开文件使用fopen()函数来创建一个新的或...使用fropen()函数,若成功打开文件,返回给文件的FILE类型的文件指针,否则返回一个空指针NULL。 参数文件名是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,285
精华内容 10,514
关键字:

c语言文件读取汉字

c语言 订阅