精华内容
下载资源
问答
  • c语言中文本文件的读、写、追加

    千次阅读 2020-02-22 22:28:40
    文件可以分为文本文件和二进制文件,这篇文章主要是讲解对文本文件的操作。 这里主要将解三个比较常见的操作读(r)、写(W)和追加(a)。 读(r):就是将数据从文件读到程序里,这要求所处理的文件一定要存在,否则...

    在c语言的编程中,我们有时候需要用到文件的操作。文件可以分为文本文件和二进制文件,这篇文章主要是讲解对文本文件的操作。

    文件的操作是包含在头文件

    stdio.h
    

    首先需要将文件打开

    FILE *fp;
    fp=fopen("filename","打开方式");  //该函数是
    

    这里主要将解三个比较常见的操作读(r)、写(W)和追加(a)。

    • 读(r):就是将数据从文件读到程序里,这要求所处理的文件一定要存在,否则就会读取失败
    • 写(w):就是将数据写入文件中,所处理的文件可以存在,也可以不存在,如果不存在就会自动创建一个新的文件,然后再将所写的数据存入文件中。但是如果文件已经存在了,并且文件里面已经有数据了,如果执行写操作,那么原有的内容就会被覆盖。
    • 追加(a):跟写操作有点类似,文件可以存在也可以不存在,但是如果文件存在,并且有数据,执行写操作时(fopen(“filename”,“a”))时,所写进的数据会存在已有数据的后面,不会覆盖原有数据。
      下面就用一个例子来演示一下:
      题目要求:
      读取一个文件,并将文件里的数据打印出来。
    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
    	FILE *fp;
    	char ch,filename[100];  //filename用来存储文件名
    	printf("请输入文件名");
    	gets(filename);
    	if((fp=fopen(filename,"r"))==NULL)
    	{
    		printf("读取文件失败\n");
    		exit(0);
    	}
    	while((ch=fgetc(fp))!=EOF)  //等于EOF表示读到文件末尾,或者读取失败
    	{
    		putchar(ch);
    	}
    	fclose(fp);  //将文件关闭
    	return 0;
    }
    

    这里需要强调一下,我们在处理完文件之后需要将文件关闭,主要有两方面原因:
    1、文件是缓冲区中是数据的量达到一定是才写进文件的,要将文件关闭才能将数据写入文件。
    2、打开一个文件就要占一部分内存,如果内存中打开的文件太多可能其他文件就不能打开,这方面也算是节约资源。

    展开全文
  • C语言 文件操作(一)

    2019-07-29 09:22:27
    操作文件的正确流程为:打开文件 --> 读写文件 --> 关闭文件。文件在进行读写操作之前要先...二进制文件中存储的数据的二进制,直接把数据的二进制存储到文件中,无法直接通过文件编辑器查看。 1、打开/关闭...

    操作文件的正确流程为:打开文件 --> 读写文件 --> 关闭文件。文件在进行读写操作之前要先打开,使用完毕要关闭。

    文本文件与二进制文件:
    磁盘只能存储二进制数据。
    文件文件中存储的是ASCII码的二进制,先把数据转换成字符中,再写入到文件中,可以直接被文本编辑器打开。
    二进制文件中存储的数据的二进制,直接把数据的二进制存储到文件中,无法直接通过文件编辑器查看。

    1、打开/关闭文件函数

    fopen()函数

    功能:用于打开文件

    调用格式:FILE *fopen(const char *path, const char *mode);

    参数:
      path:文件的路径(可以是相对路径,也可以是绝对路径)
      mode:文件的访问模式

    模式 描述
    "w" 以只写权限打开文件,如果文件不存在则创建,存在则清空文件的内容
    "w+" 在"w"的基础上增加读取权限
    "r" 以只读权限打开文件,如果文件不存在则打开失败
    "r+" 在"r"的基础上增加写取权限
    "a" 以只写权限打开文件,如果文件不存在则创建,存在保留原内存,新写入的数据会追加到文件末尾
    "a+" 在"a"的基础上增加读取权限
    "b" 不能单独使用,而是与"wra"配合使用,表示打开的是二进制文件,对于Linux系统二说没什么用

    如果处理的是二进制文件,使用"rb", "wb","ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"
    在Windows系统下:
       "b"表示操作的是二进制文件\n直接写入\n
       不加"b"表示操作的是文本文件,\n 会被写入 \n\r

    返回值:
      返回的是一个结构体指针,不需要操作结构的成员,只需要反它当作一个令牌即可,用来区别所操作的文件,如果文件打开失败返回值为NULL。

    fclose()函数

    功能:关闭一个由 fopen()函数打开的文件 。

    调用格式为: int fclose(FILE *stream);

    返回值:
      该函数返回一个整型数。当文件关闭成功时, 返回 0, 否则返回一个非零值。可以根据函数的返回值判断文件是否关闭成功。

    示例:

    #include <stdio.h>
    
    int main()
    {
    	FILE* frp = fopen("test.txt","r");
    	if(NULL == frp)
    	{
    		perror("fopen");
    		return -1;
    	}
    	if(!fclose(fp))
    		printf("close ok");
    	else
    		printf(""File close error"");
    }
    

    2、写操作函数和读操作函数

    有关文件操作的函数本节所涉及到的文件读写函数均是指顺序读写,即读写了一条信息后,指针自动。

    2.1写操作函数

    fprintf()fputs()fputc()函数均为文件的顺序写操作函数,下面分别介绍:

    fprintf()函数

    调用格式:int fscanf(FILE *stream, const char *format, ...);

    功能:发送格式化输出到流 stream 中

    参数:
      stream:文件指针,fopen函数的返回值
      format:占位符
       … :变量的地址

    返回值:成功读取到的变量的个数

    #include <stdio.h>
    
    int main()
    {
    	FILE* frp = fopen("test.txt","a");
    	if(NULL == frp)
    	{
    		// 显示出错原因
    		perror("fopen");
    		return -1;
    	}
    	
    	printf("文件打开成功\n");
    	int num = 100;
    	float f = 3.14;
    	char ch = 65;
    	int ret = fprintf(frp,"%d",num);
    	printf("写入的字节数:%d\n",ret);
    }
    
    运行结果:
    文件打开成功
    写入的字节数:3
    

    fpuf()函数

    调用格式:int fputs(const char *s, FILE *stream);

    功能:把由s指出的字符串写入到stream所指的文件中去。
      
    参数说明
      s:指出要写到文件中去的字符串。
      stream:这是个文件指针,指出字符串要写入其中的文件。
    返回值
      正常返回: 写入文件的字符个数,即字符串的长度。
      非正常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。例如,要往一个"读打开" 文件中写字符串时,会发生错误而返回一个NULL值。

    #include <stdio.h>
    
    int main ()
    {
       FILE *fp;
       fp = fopen("file.txt", "w+");
       fputs("这是 C 语言。", fp);
       fputs("这是一种系统程序设计语言。", fp);
       fclose(fp);
       return(0);
    }
    

    运行上面的程序,这将创建文件 file.txt,它的内容如下:

    这是 C 语言。这是一种系统程序设计语言。
    

    fputc()函数

    调用格式:int fputc(int c, FILE *stream);

    功能:把c中的字符写入由stream指出的文件中去。

    参数说明
      c:是一个整型变量,内存要写到文件中的字符(C语言中整型量和字符量可以通用)。
      stream:这是个文件指针,指出要在其中写入字符的文件。
      
    返回值
      正常返回: 要写入字符的代码。
      非正常返回:返回EOF。例如,要往"读打开"文件中写一个字符时,会发生错误而返回一个EOF。

    #include <stdio.h>
    int main ()
    {
       FILE *fp;
       int ch;
       fp = fopen("file.txt", "w+");
       for( ch = 33 ; ch <= 100; ch++ )
       {
          fputc(ch, fp);
       }
       fclose(fp);
       return(0);
    }
    

    运行上面的程序,这将在当前目录中创建文件 file.txt,它的内容如下:

    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd
    

    2.1读操作函数

    函数 fscanf()fgets()fgetc()均为文件的顺序读操作函数

    fscanf()函数

    调用格式:int fscanf(FILE *stream, const char *format, ...);

    功能:从文件中以文本形式读取数据到变量。

    参数:
      stream:文件指针,fopen函数的返回值
       format:占位符
       … :变量的地址

    返回值:成功读取到的变量的个数

    #include <stdio.h>
    #include <stdlib.h>
    
    
    int main()
    {
       char str1[10], str2[10], str3[10];
       int year;
       FILE * fp;
    
       fp = fopen ("file.txt", "w+");
       fputs("We are in 2014", fp);
       
       rewind(fp);
       fscanf(fp, "%s %s %s %d", str1, str2, str3, &year);
       
       printf("Read String1 |%s|\n", str1 );
       printf("Read String2 |%s|\n", str2 );
       printf("Read String3 |%s|\n", str3 );
       printf("Read Integer |%d|\n", year );
    
       fclose(fp);
       
       return(0);
    }
    

    运行结果:

    Read String1 |We|
    Read String2 |are|
    Read String3 |in|
    Read Integer |2014|
    

    fputs()函数

    调用格式:int fputs(const char *s, FILE *stream);;

    功能:把由str指出的字符串写入到s所指的文件中去。

    参数:
      s:指出要写到文件中去的字符串。
      stream:这是个文件指针,指出字符串要写入其中的文件。

    返回值
      正常返回: 写入文件的字符个数,即字符串的长度。
      非正常返回:返回一个NULL值,此时应当用feof()或ferror()函数来判别是读取到了文件尾,还是发生了错误。例如,要往一个"读打开" 文件中写字符串时,会发生错误而返回一个NULL值。

    #include <stdio.h>
    int main()
    {
        char str[20];  /*定义一个最大长度为19, 末尾是'\0'的字符数组来存储字符串*/
        printf("请输入一个字符串:");
        fgets(str, 19, stdin);  /*从输入流stdin中读取19个字符到字符数组str中*/
        fputs(str, stdout);  //将字符数组的内容输出到输出流stdout中
        return 0;
    }
    

    运行结果:

    请输入一个字符串:i love you
    i love you
    

    fputc()函数

    调用格式:int fputc(int ch,FILE *fp);

    功能:把ch中的字符写入由fp指出的文件中去。

    参数:
      ch:是一个整型变量,内存要写到文件中的字符(C语言中整型量和字符量可以通用)。
      fp:这是个文件指针,指出要在其中写入字符的文件。

    返回值
      正常返回: 要写入字符的代码。
      非正常返回:返回EOF。例如,要往"读打开"文件中写一个字符时,会发生错误而返回一个EOF。

    #include <stdio.h>
     
    int main ()
    {
       FILE *fp;
       int ch;
       fp = fopen("file.txt", "w+");
       for( ch = 33 ; ch <= 100; ch++ )
       {
          fputc(ch, fp);
       }
       fclose(fp);
       return(0);
    }
    

    编译并运行上面的程序,这将在当前目录中创建文件 file.txt,它的内容如下:

    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd
    

    以上文件的读写操作都是文本形式的,关于二进制形式文件的操作及其文件指针定位请参考小编其他博客:C语言 文件操作(二)

    展开全文
  • 12.2 二进制文件操作 知识导例 从键盘输入两个学生数据写入C盘C语言案例目录中的file4.dat文件中然后读出这两个学生的数据并显示在屏幕上 12(292-310)P19 fyy_Embed_5.png 图12-5 程序ex12_2_1.c运行结果 相关知识 1...
  • 根据数据的组织形式,可分为ASCII文件和二进制文件。ASCII文件又称为文本(text)文件,它的每个字节放一个ASCII代码,代表一个字符。二进制文件是把内存中的数据按其在内在中的存储形式原样输出到磁盘上存放。 ...
    C语言把文件看作一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。根据数据的组织形式,可分为ASCII文件和二进制文件。ASCII文件又称为文本(text)文件,它的每个字节放一个ASCII代码,代表一个字符。二进制文件是把内存中的数据按其在内在中的存储形式原样输出到磁盘上存放。
    

    fprintf(fp, "%d", buffer);是将格式化的数据写入文件
    fprintf(文件指针,格式字符串,输出表列);

    fwrite(&buffer, sizeof(int), 1,fp);是以二进位方式写入文件
    fwrite(数据,数据类型大小(字节数),写入数据的最大数量,文件指针);

    由于fprintf写入时,对于整数来说,一位占一个字节,比如1,占1个字节;10,占2个字节;100,占3个字节,10000,占5个字节
    所以文件的大小会随数据的大小而改变,对大数据空间占用很大。
    而fwrite是按二进制写入,所以写入数据所占空间是根据数据类型来确定,比如int的大小为4个字节(一般32位下),那么整数10所占空间为4个字节,100、10000所占空间也是4个字节。所以二进制写入比格式化写入更省空间。

    因此,
    对于1 2 3 4 5 6 7 8 9 0十个整数,用fprintf写入时,占10个字节;而用fwrite写入时,占40个字节。
    对于100 101 102 103 104 105 106 107 108 109 110这十个整数,用fprintf写入时,占30个字节;而用fwrite写入时,占40个字节。
    对于10000 10100 10200 10300 10400 10500 10600 10700 10800 10900 11000这十个整数,用fprintf写入时,占50个字节;而用fwrite写入时,还是占40个字节。

    fwrite 函数按照指定的数据类型将矩阵中的元素写入到文件中。写二进制文件
    其调用格式为:COUNT=fwrite (fid, A,precision)其中COUNT返回所写的数据元素个数,fid为文件句柄,A用来存放写入文件的数据,precision用于控制所写数据的类型,其形式与fread函数相同。
    fprintf 写文本文件 函数的调用格式为:COUNT=fprintf(fid, format,A)其中A存放要写入文件的数据。先按format指定的格式将数据矩阵A格式化,然后写入到fid所指定的文件。format用以控制读取的数据格式,由%加上格式符组成,常见的格式符有d,f,c,s。fid为文件句柄。

    看如下的例子:

     

    [cpp] viewplaincopy
    1. #include   
    2. void main()  
    3. {  
    4.     int num;  
    5.     char name[5];  
    6.     FILE *fp;  
    7.     if ((fp = fopen("t.txt""w")) == NULL)  
    8.         printf("cannot open file!\n");  
    9.    scanf("%d %s",&num,name);  
    10.    fprintf(fp, "%d %s", num, name);  
    11.    fclose(fp);  
    12.    if ((fp = fopen("tt.txt""w")) == NULL)  
    13.         printf("cannot open file!\n");  
    14.    fwrite(&num, sizeof(int), 1, fp);  
    15.    fwrite(name, sizeof(char), 5, fp);  
    16.    fclose(fp);   
    17. }  

     

    输入:100000 liuj

    使用记事本打开两个文本文件t.txt和tt.txt,结果如下:

    t.txt: 100000liuj    (文件大小:11字节)

    tt.txt:爢 liuj (乱码,文件大小:9字节)

    当我们按照文本方式往文件中写入数据时,一旦遇到换行字符(ASCII为10),则会转换为回车-换行(ASCII为13、10)。在读取文件时,一旦遇到回车-换行的组合(即连续的ASCII13、10),则会转换为换行字符(ASCII为10)。

    当我们按照二进制方式往文件中写入数据,则将数据在内存中的存储形式原样输出到文件中。

    ------------------------------------------------------------------------------------

    《计算机组成原理》
    比如
    intv=1;
    fwrite(&v,sizeof(int),1,f);//文件中被写四个字节0x010x00 0x00 0x00(32位int,小端存储)
    fprintf(f,"%d",v);//文件中被写一个字节0x31(即'1'的ASCII码)
    又比如
    intv=0x12345678;
    fwrite(&v,sizeof(int),1,f);//文件中被写四个字节0x780x56 0x34 0x12(32位int,小端存储)
    fprintf(f,"%x",v);//文件中被写八个字节0x310x32 0x33 0x34 0x35 0x36 0x37 0x38
    fprintf(f,"%d",v);//文件中被写九个字节0x330x30 0x35 0x34 0x31 0x39 0x38 0x39 0x36
    (因为0x12345678==305419896)

    -----------------------------------------------------------------------------------

    一句话表述:fwrite是将数据不经转换直接以二进制的形式写入文件,而fprintf是将数据转换为字符后再写入文件。

    这样就导致:

    当使用fwrite将一个int型数字65写入文本文件时,由于65对应的二进制数是1000001,十六进制数是0x41,存储的是以二进制的形式1000001.在notepad++中使用十六进制方式打开显示的是:0x0041,转换为十进制则为65,使用记事本打开这个文本文件后显示的是A,因为记事本程序默认为存储在文本文件中的数据都是ASCII码形式存储,它把65当做ASCII码翻译为字符A。

    当使用fpintf将一个int型数字65写入文本文件时,将65每一位转换为ASCII码存储,6、5分别对应ASCII码54、53,存储的是ASCII码54、53.在notepad++中使用十六进制方式打开显示的是:3635,转换为十进制则为54、53,这正是数字6、5的ASCII码。使用记事本打开这个文本文件时,记事本将存储在其中的54、53当做ASCII码翻译为字符6、5显示,我们看到的是便是字符65。

    ----------------------------我是分割线------------------------

    如果要实现显示界面上文本对齐功能,建议按照printf("-20f")格式;

    展开全文
  • 这导致空间浪费而且无法与外部数据文件进行“二进制”读写。能否关掉填充,或者控制结构域的对齐方式?  2.14 为什么sizeof返回的值大于结构大小的期望值,是不是尾部有填充?  2.15 如何确定域在结构中的字节...
  • 这导致空间浪费而且无法与外部数据文件进行“二进制”读写。能否关掉填充,或者控制结构域的对齐方式? 2.14 为什么sizeof返回的值大于结构大小的期望值,是不是尾部有填充? 2.15 如何确定域在结构中的字节偏移量?...
  • 数据文件进行”二进制” 读写。能否关掉填充, 或者控制结构域 的对齐方式? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.11 为什么sizeof 返回的值大于结构的期望值, 是不是尾部有填充? . . ...
  • 你必须知道的495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    数据文件进行”二进制” 读写。能否关掉填充, 或者控制结构域 的对齐方式? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.11 为什么sizeof 返回的值大于结构的期望值, 是不是尾部有填充? . . ...
  • 这导致空间浪费而且无法与外部数据文件进行“二进制”读写。能否关掉填充,或者控制结构域的对齐方式? 2.14 为什么sizeof返回的值大于结构大小的期望值,是不是尾部有填充? 2.15 如何确定域在结构中的字节偏移量?...
  • 21天学通C++ (中文第五版)

    热门讨论 2010-06-23 16:57:03
    13.1.2 在数组末尾后写入数据 13.1.3 护栏柱错误 13.1.4 初始化数组 13.1.5 声明数组 13.2 使用对象数组 13.2.1 声明多维数纽 13.2.2 初始化多维数组 13.3 指针数组 13.4 指针算术 13.5 在自由存储区声明...
  • 读者将学习如何打开文件,以进行输入和输出,如何在文件中追加数据,如何使用二进制文件,如何获得 对文件的随机访问权。最后,还将学习如何使用标准的I/O方法来读取和写入字符串。 附录A:计数系统 本附录讨论...
  • 读者将学习如何打开文件,以进行输入和输出,如何在文件中追加数据,如何使用二进制文件,如何获得 对文件的随机访问权。最后,还将学习如何使用标准的I/O方法来读取和写入字符串。 附录A:计数系统 本附录讨论...
  • 读者将学习如何打开文件,以进行输入和输出,如何在文件中追加数据,如何使用二进制文件,如何获得 对文件的随机访问权。最后,还将学习如何使用标准的I/O方法来读取和写入字符串。 附录A:计数系统 本附录讨论...
  • 读者将学习如何打开文件,以进行输入和输出,如何在文件中追加数据,如何使用二进制文件,如何获得 对文件的随机访问权。最后,还将学习如何使用标准的I/O方法来读取和写入字符串。 附录A:计数系统 本附录讨论...
  • 实例181 将数据写入磁盘文件 259 实例182 格式化读写文件 260 实例183 成块读写操作 262 实例184 随机读写文件 263 实例185 以行为单位读写文件 265 6.2 文件内容操作 266 实例186 复制文件内容到另一...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    -n:一般而言,mount挂上后会在/etc/mtab中写入一笔资料,在系统中没有可写入文件系统的情况下,可以用这个选项取消这个动作。 4.应用技巧 在Linux 和Unix系统上,所有文件都是作为一个大型树(以/为根)的一部分...
  • 会计理论考试题

    2012-03-07 21:04:40
    A、模拟信息 B、模拟信息或数字信息 C、数字形式D、二进制形式的数字 6.在Windows98中,要恢复回收站中的文件,只要___B____。 A、双击该文件 B、用鼠标把该文件施出回收站 C、单击该文件 D、A、B、C均可 7.在...
  • 二进制数据类型 row 1~2000字节 可变长二进制数据,在具体定义字段的时候必须指明最大长度n long raw 1~2GB 可变长二进制数据 LOB数据类型 clob 1~4GB 只能存储字符数据 nclob 1~4GB 保存本地语言字符集数据 blob...
  • RedisWriteFile-通过 Redis 主从写出无损文件,可用于 Windows 平台下写出无损的 EXE、DLL、 LNK 和 Linux 下的 OS 等二进制文件 WeblogicScanLot系列,Weblogic漏洞批量检测工具 jboss_CVE-2017-12149 Wordpress的...
  • 如果想要强行转换变量类型,可以使用与C语言相同的函数settype()。 2.5 变量与常量 可能你已经注意到,变量都有一个美元符号($)的前缀。所有变量都是局部变量,为了使得定义的函数中可以使用外部变量,使用...

空空如也

空空如也

1 2
收藏数 21
精华内容 8
关键字:

c语言文数据写入二进制文件

c语言 订阅