精华内容
下载资源
问答
  • 不知道大家没有想过一个问题:C语言编译器为什么能够用C语言编写? 今天小编就带大家一探究竟! 所谓C语言编译器,就是把编程得到的文件,比如.c,.h的文件,进行读取,并对内容进行分析,按照C语言的规则,...

    不知道大家有没有想过一个问题:C语言编译器为什么能够用C语言编写?

     

    今天小编就带大家一探究竟!

    所谓C语言编译器,就是把编程得到的文件,比如.c,.h的文件,进行读取,并对内容进行分析,按照C语言的规则,将其转换成cpu可以执行的二进制文件。

    其本质在于对文件的读入,分析,及处理。这些操作,C语言都是可以实现的。

    所以用C语言来做C语言的编译器是完全可行的。

    但是,历史上的第一个C语言编译器,肯定不是C语言写的,因为在没有编译器时,无法把C语言转换成可执行文件。只要有了第一版其它语言的编译器,就可以用C语言写编译器了。

    那么世界上第一个C语言编译器又是怎么编写的呢?

    还是让我们回顾一下C语言历史:

    1970年Tomphson和Ritchie在BCPL(一种解释型语言)的基础上开发了B语言,

    1973年又在B语言的基础上成功开发出了现在的C语言。

    在C语言被用作系统编程语言之前,Tomphson已经使用B语言编写过操作系统。可见在C语言实现以前,B语言已经可以投使用了。

     

    因此第一个C语言编译器的原型完全可能是用B语言或者混合B语言与PDP汇编语言编写的。

    事实上,B语言的执行效率比较低,但是如果全部用汇编语言来编写,不仅工作量巨大,而且汇编语言的可读性极差,很容易就会出错!

    上一张图大家感受一下这巨大的差别!!!

    为了克服这个困难,早期的C语言编译器就采取了一个取巧的办法:先用汇编语言编写一个C语言的一个子集的编译器,再通过这个子集去递推完成完整的C语言编译器。

    大致过程如下:

    先创造一个只有C语言最基本功能的子集,记作C0语言,C0语言已经足够简单了,可以直接用汇编语言编写出C0的编译器。

    依靠C0已有的功能,设计比C0复杂,但仍然不完整的C语言的又一个子集C1语言,其中C0属于C1,C1属于C,用C0开发出C1语言的编译器。

    在C1的基础上设计C语言的又一个子集C2语言,C2语言比C1复杂,但是仍然不是完整的C语言,开发出C2语言的编译器……如此直到CN,CN已经足够强大了,这时候就足够开发出完整的C语言编译器的实现了。

    至于这里的N是多少,这取决于你的目标语言(这里是C语言)的复杂程度和程序员的编程能力。

     

    那么这种大胆的子集简化的方法,又有什么理论依据呢?

    先介绍一个概念,“自编译”Self-Compile。

    对于某些具有明显自举(不知道哪个鬼才起的名字)性质的强类型编程语言

    可以借助它们的一个有限小子集

    通过有限次数的递推来实现对它们自身的表述

     

    想要成为一个优秀的、有能力程序员,做软件开发的话,就来学习C/C++吧,而且学习编程的话有一个学习的氛围跟交流圈子特别重要!这里我推荐一个C语言C++交流扣裙,--先八七零九;后63251,不管你是大牛还是小白,大家都一起成长进步。

    (所谓强类型就是程序中的每个变量必须声明类型后才能使用,比如C语言,相反有些脚本语言则根本没有类型这一说法,比如python。)

    满足自编译这样的语言有C、Pascal、Ada等等,至于为什么可以自编译,可以参见清华大学出版社的《编译原理》,书中实现了一个Pascal的子集的编译器。

    总之,已经有计算机科学家证明了,C语言理论上是可以通过上面的方法实现完整的编译器的。

    展开全文
  • C语言文件操作

    2021-05-07 09:25:42
    C语言文件操作1.文件是什么2.一个数据在内存中是怎么储存的3.文件缓冲区4.文件指针5.文件的打开和关闭6.有关文件顺序读写的函数fgetc如果vs编译器出现4996报错可以以下方法解决fputcfgetsfputsfprintffscanf 1....

    1.文件是什么

    程序设计中一般存在的文件有两种:程序文件,数据文件。

    • 程序文件:源程序文件(.c),目标文件(windows下为.obj),可执行文件(windows下为.exe)。
    • 数据文件:程序运行时读写的数据。
    • 文件类型:文本文件,二进制文件。
    • 文件名:一个文件要有一个唯一的文件名标识,以便用户识别和使用。
    • 文件名包含:文件路径+文件名主干+文件后缀。
      例:
    c:\code\test.txt
    

    为了方便,文件名标识常被称为文件名

    • 二进制文件:数据在内存中以二进制储存,如果不加转化储存到外存上就是二进制文件。
    • 文本文件:如果要求在外存上以ASCII码的形式储存,则需要在储存前转化,以ASCII码值存放的的数据就是文本文件。

    2.一个数据在内存中是怎么储存的

    • 字符一律以ASCII码形式储存,数值类型数据既可以用ASCII码形式储存也可以使用二进制。
      例:存放10000
      在这里插入图片描述

    3.文件缓冲区

    ANSIC标准采用“缓存文件系统”处理数据文件,所谓缓存文件系统是指系统自动的在内存中为每一个程序中每一个正在使用的文件开辟一块“文件缓存区”。从内存向磁盘输出的数据会先送到内存中的缓存区,装满缓存区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘中读取数据输入到内存缓存区,充满缓存区然后再从缓冲区逐个的将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。
    在这里插入图片描述

    4.文件指针

    缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件的当前位置等)。这些信息是保存在一个结构体变量中的,该结构体是有系统声明的,取名FILE。

    • VS2019中对FILE的定义
     typedef struct _iobuf
        {
            void* _Placeholder;
        } FILE;
    

    不同的编译器FILE包含的内容不完全相同。

    • 每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息使用者不必关系细节一般都是通过一个FILE的指针来维护这个FILE结构的变量,并填充其中的信息,这样使用起来更方便我们可以创建一个FILE*的指针变量。
    • 定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体)。通过该文件信息区中的文件就能访问该文件,通过文件指针变量能够找到与它关联的文件。

    5.文件的打开和关闭

    文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。在编写程序的时候,在打开文件的同时,都会返回一个FILE* 的指针变量指向该文件,也相当于建立了指针和文件的关系。ANSIC规定使用fopen函数来打开文件,fclose来关闭文件。

    fopen函数和fclose函数的定义:

    FILE* fopen(const char* filename, const char* mode);
    int fclose(FILE* stream);
    
    文件使用方式         含义                                           如果文件不存在
    r  (只读)          为了输入数据,打开一个已经存在的文本文件          出错
    w  (只写)          为了输入数据,打开一个文本文件                   建立一个新的文件
    a  (追加)          向文本文件尾添加数据                            出错
    rb (只读)          为了输入数据,打开一个二进制文件                 出错
    wb (只写)          为了输出数据,打开一个二进制文件                 创建一个新的文件
    ab (追加)          向一个二进制文件尾追加数据                       出错
    r+ (读写)          为了读和写,打开一个文本文件                     出错
    w+ (读写)          为了读和写,建立一个新的文件                     建立一个新的文件
    a+ (读写)          打开一个文件,在文件尾进行读写                   建立一个新的文件
    rb+(读写)          为了读和写打开一个二进制文件                     出错
    wb+(读写)          为了读和写,新建一个新的二进制文件               建立一个新的文件
    ab+(读写)          打开一个二进制文件,在文件尾进行读和写            建立一个新的文件
    

    6.有关文件顺序读写的函数

    fgetc

    从指定流中读取字符
    函数定义

    int fgetc(FILE*fp);
    

    fp:文件指针
    返回值:返回读取为int的字符或返回EOF以指示错误。

    fgetc的使用
    先在项目文件下新建一个test.txt文件,并且写入hello world
    在这里插入图片描述

    #include<stdio.h>
    int main()
    {
    	char ch ;
    	int i = 0;
    	FILE* pf = fopen("test.txt", "r");
    	if (pf == NULL)//判断打开文件是否成功
    	{
    		return 0;
    	}
    	for(i=0;i<=10;i++)
    	{
            ch = fgetc(pf);//一次只能读一个字符
    	    printf("%c\n", ch);
    	}
    	fclose(pf);
    	pf = NULL;
    	return 0;
    }
    

    MSDN

    • Each of these functions reads a single character from the current position of a file; in the case of fgetc and fgetwc, this is the file associated with stream. The function then increments the associated file pointer (if defined) to point to the next character. If the stream is at end of file, the end-of-file indicator for the stream is set.

    如果vs编译器出现4996报错可以用以下方法解决

    • 方法一:在程序最前面加#define _CRT_SECURE_NO_DEPRECATE;
    • 方法二:在程序最前面加#define _CRT_SECURE_NO_WARNINGS;
    • 方法三:在程序最前面加#pragma warning(disable:4996);
    • 方法四:把scanf、scanf改为scanf_s、fopen_s,具体方法请百度;
    • 方法五:无需在程序最前面加那行代码,只需在新建项目时取消勾选“SDL检查”即可;
    • 方法六:若项目已建立好,在项目属性里关闭SDL也行;
    • 方法七:在工程项目设置一下就行;将报错那个宏定义放到 项目属性 – C / C+±-预处理器 – 预处理器定义;
    • 方法八:在 项目属性 – c / c++ --命令行 添加: / D _CRT_SECURE_NO_WARNINGS 就行了。

    fputc

    把字符写入指定流中
    函数定义

    int fputc(int char,FILE*stream);
    

    char:写入的字符。
    stream:指向写入的流。
    返回值:返回读取为int的字符或返回EOF以指示错误。
    例:

    #include<stdio.h>
    int main()
    {
    	char* a = "w";
    	FILE* pf = fopen("test.txt", "w");
    	if (pf == NULL)
    	{
    		return 0;
    	}
    	fputc(*a, pf);
    	fclose(pf);
    	pf = NULL;
    	return 0;
    
    }
    

    此时打开文件test.txt就会发现原来的hello world被改为了w。

    MSDN

    • Each of these functions writes the single character c to a file at the position indicated by the associated file position indicator (if defined) and advances the indicator as appropriate. In the case of fputc and fputwc, the file is associated with stream. If the file cannot support positioning requests or was opened in append mode, the character is appended to the end of the stream.

    fgets

    从指定流中读取字符串
    函数定义:

    char* fgets(char*s,int n,FILE* stream);
    

    s:字符型指针,指向储存读入数据的缓冲区地址。
    n:从流中读取n-1个字符
    stream:指向读取的流
    返回值:返回读取为int的字符或返回EOF以指示错误。

    先将test中内容改为hello world

    #include<stdio.h>
    int main()
    {
    	char s[20] = { 0 };
    	FILE* pf = fopen("test.txt", "r");
    	if (pf == NULL)
    	{
    		return 0;
    	}
    	fgets(s, 12, pf);
    	fclose(pf);
    	pf = NULL;
    	printf("%s", s);
    	return 0;
    }
    

    MSDN

    • The fgets function reads a string from the input stream argument and stores it in string. fgets reads characters from the current stream position to and including the first newline character, to the end of the stream, or until the number of characters read is equal to n – 1, whichever comes first. The result stored in string is appended with a null character.

    fputs

    把字符串写入指定流中
    函数定义:

    int fputs(const char*str,FILE*stream);
    

    str:包含要写入的以空字符终止的字符序列
    stream:指向写入的流
    例:

    #include<stdio.h>
    int main()
    {
    	FILE* pf = fopen("test.txt", "w");
    	if (pf == NULL)
    	{
    		return 0;
    	}
    	fputs("wuhu qifei", pf);
    	fclose(pf);
    	pf = NULL;
    	return 0;
    }
    

    test中变为wuhu qifei

    MSDN

    • Each of these functions copies string to the output stream at the current position. fputws copies the wide-character argument string to stream as a multibyte-character string or a wide-character string according to whether stream is opened in text mode or binary mode, respectively. Neither function copies the terminating null character.

    fprintf

    将格式化数据输入到流
    函数定义

    int fprintf(FILE* stream,char*format,[argument...]);
    

    stream:文件指针
    format:格式字符串
    argument:输入列表

    #include<stdio.h>
    struct wuhu
    {
    	int a;
    	float f;
    };
    int main()
    {
    	struct wuhu wuhu = { 5,3.14 };
    	FILE* pf = fopen("test.txt", "w");
    	if (pf == NULL)
    	{
    		return 0;
    	}
    	fprintf(pf, "%d %f", wuhu.a, wuhu.f);
    	fclose(pf);
    	pf = NULL;
    	return 0;
    }
    
    

    test中被改为 5 和 3.14

    MSDN

    • fprintf formats and prints a series of characters and values to the output stream. Each function argument (if any) is converted and output according to the corresponding format specification in format. For fprintf, the format argument has the same syntax and use that it has in printf.
      fwprintf is a wide-character version of fprintf; in fwprintf, format is a wide-character string. These functions behave identically otherwise.

    fscanf

    从流中读取格式化数据
    函数定义

    int fscanf(FILE*stream,char*format,[argument...]);
    

    stream:文件指针
    format:格式字符串
    argument:输出列表

    #include<stdio.h>
    struct wuhu
    {
    	int a;
    	float f;
    };
    int main()
    {
    	struct wuhu wuhu = { 0 };
    	FILE* pf = fopen("test.txt", "r");
    	if (pf == NULL)
    	{
    		return 0;
    	}
    	fscanf(pf, "%d %f", &wuhu.a, &wuhu.f);
    	fclose(pf);
    	pf = NULL;
    	printf("%d %f", wuhu.a, wuhu.f);
    	return 0;
    }
    

    上述代码会读出存入的 5 和3.14

    MSDN

    • The fscanf function reads data from the current position of stream into the locations given by argument (if any). Each argument must be a pointer to a variable of a type that corresponds to a type specifier in format. format controls the interpretation of the input fields and has the same form and function as the format argument for scanf; see scanf for a description of format. If copying takes place between strings that overlap, the behavior is undefined.
      fwscanf is a wide-character version of fscanf; the format argument to fwscanf is a wide-character string. These functions behave identically otherwise.

    7.有关文件随机读写的函数

    fseek

    根据文件指针的位置和偏移量来定位文件指针
    函数定义

    int fseek(FILE*stream,long int offset,int origin);
    

    stream:文件指针
    offset:偏移量,整数表示正向偏移,负数表示负向偏移
    origin:设定从文件的哪里开始偏移,可能取值为:SEEK_CUR,SEEK_END或SEEK_SET
    SEEK_SET: 文件开头
    SEEK_CUR: 当前位置
    SEEK_END: 文件结尾

    #include<stdio.h>
    int main()
    {
    	char arr[30] = { 0 };
    	FILE* pf = fopen("test.txt", "r+");
    	if (pf == NULL)
    	{
    		return 0;
    	}
    	fputs("Wu   qifei",pf);
    	fseek(pf, 2, SEEK_SET);
    	fputs("hu", pf);
    	fgets(arr, 9, pf);
    	fclose(pf);
    	pf = NULL;
    	return 0;
    }
    

    文件中test中写入wuhu qifei 但是用fgets读取却只能读取到qifei这是因为文件指针已经被移动到了qifei前面 如果wu的后面不留空格hu会覆盖后面的qifei

    MSDN

    • The fseek function moves the file pointer (if any) associated with stream to a new location that is offset bytes from origin. The next operation on the stream takes place at the new location. On a stream open for update, the next operation can be either a read or a write. The argument origin must be one of the following constants, defined in STDIO.H:

    ftell

    返回文件指针相对于起始位置的偏移量
    函数定义

    long int ftell(FILE*stream);
    

    #include<stdio.h>
    int main()
    {
    	long size;
    	char arr[30] = { 0 };
    	FILE* pf = fopen("test.txt", "r+");
    	if (pf == NULL)
    	{
    		return 0;
    	}
    	fputs("Wu   qifei",pf);
    	fseek(pf, 2, SEEK_SET);
    	fputs("hu", pf);
    	size = ftell(pf);
    	printf("偏移量为:%ld",size);
    	fclose(pf);
    	pf = NULL;
    	return 0;
    }
    

    可以求出偏移量为4即在wuhu的后面如果想让指针回到起始位置就可以用下面一个函数

    MSDN

    • The ftell function gets the current position of the file pointer (if any) associated with stream. The position is expressed as an offset relative to the beginning of the stream.
      Note that when a file is opened for appending data, the current file position is determined by the last I/O operation, not by where the next write would occur. For example, if a file is opened for an append and the last operation was a read, the file position is the point where the next read operation would start, not where the next write would start. (When a file is opened for appending, the file position is moved to end of file before any write operation.) If no I/O operation has yet occurred on a file opened for appending, the file position is the beginning of the file.
      In text mode, CTRL+Z is interpreted as an end-of-file character on input. In files opened for reading/writing, fopen and all related routines check for a CTRL+Z at the end of the file and remove it if possible. This is done because using ftell and fseek to move within a file that ends with a CTRL+Z may cause ftell to behave improperly near the end of the file.

    rewind

    让文件指针的位置回到文件的起始位置
    函数定义

    void rewind(FILE*stream);
    

    #include<stdio.h>
    int main()
    {
    	char arr[30] = { 0 };
    	FILE* pf = fopen("test.txt", "r+");
    	if (pf == NULL)
    	{
    		return 0;
    	}
    	fputs("Wu   qifei",pf);
    	fseek(pf, 2, SEEK_SET);
    	fputs("hu", pf);
    	rewind(pf);
    	fgets(arr, 10, pf);
    	printf("%s", arr);
    	fclose(pf);
    	pf = NULL;
    	return 0;
    }
    

    文件指针复原后fgets可以读到所有内容

    MSDN

    • The rewind function repositions the file pointer associated with stream to the beginning of the file. A call to rewind is similar to
      (void) fseek( stream, 0L, SEEK_SET );
      However, unlike fseek, rewind clears the error indicators for the stream as well as the end-of-file indicator. Also, unlike fseek, rewind does not return a value to indicate whether the pointer was successfully moved.
      To clear the keyboard buffer, use rewind with the stream stdin, which is associated with the keyboard by default.

    8.文件结束判定

    在文件读取过程中,不能使用feof函数的返回值来判断文件是否结束而是用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件结尾结束.

    • 1.文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets)
      例如
      fgets判断是否为EOF
      fgets判断返回值是否为NULL
    • 2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数
      例如
      fread判断返回值是否小于实际要读的个数。

    ferror

    ferror()函数检查stream(流)中的错误, 如果没发生错误返回0,否则返回非零. 如果发生错误, 使用perror()检测发生什么错误.
    函数定义

     int ferror( FILE *stream );
    

    #include<stdio.h>
    int main()
    {
    	int c;
    	FILE* pf = fopen("test.txt", "r");
    	if (pf == NULL)
    	{
    		return 0;
    	}
    	while ((c = fgetc(pf)) != EOF)//  I/O读取文件循环
    	{
    		putchar(c);
    	}
    	if (ferror(pf))
    	{
    		puts("读取时出错:");
    	}
    	return 0;
    
    }
    

    feof

    feof()是检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0
    函数定义

    int feof( FILE *stream );
    

    例子

    #include<stdio.h>
    int main()
    {
    	int c;
    	FILE* pf = fopen("test.txt", "r");
    	if (pf == NULL)
    	{
    		return 0;
    	}
    	while ((c = fgetc(pf)) != EOF)//  I/O读取文件循环
    	{
    		putchar(c);
    	}
    	if (ferror(pf))
    	{
    		puts("读取时出错:");
    	}
    	else if (feof(pf))
    	{
    		printf("已成功到达文件结尾");
    	}
    	return 0;
    
    }
    
    展开全文
  • 文件输入输出的时候,的是结构体链表,放入的链表只有两个一个是头, 另一个是内容的(头无内容)。但是每次读出的时候总会多出一个节点, 结构体 和 读入 读出 代码如下 ``` typedef struct vip ...
  • c语言文件的读写问题

    2021-03-12 08:18:17
    c语言中进行文件的读写操作时 如果我是先a+即文本的实行打开一个.txt文件进行fread的操作 ...这样做会有什么不妥的地方嘛,(二进制的形式读写.txt的文件)</p>
  • c语言文件chess.c

    2020-04-14 11:18:58
    数据结构习题:已知两人分别执白棋和黑棋在一个围棋棋盘上下五子棋,若同一颜色的棋子在同一条横行、纵行或斜线上连成5个棋子,则执该颜色棋子的人获胜。...无论输出什么结果,最后都要回车换行符。
  • C语言文件操作函数

    2016-07-30 17:14:53
    万一数据上一些小改动,那就更苦逼了,所以还是用文件来帮我们记录下来,这样在分析的时候才能更方便一些。 再说了,什么地方都需要用到文件,所以这个也是个重要的操作啊! 需要包含头文件 来一个小示例: ...

    有时候在调试程序需要进行大量数据的输入输出时,如何还是采用scanf()、printf()的方式进行,那就苦逼了。。。
    万一数据上有一些小改动,那就更苦逼了,所以还是用文件来帮我们记录下来,这样在分析的时候才能更方便一些。
    再说了,什么地方都需要用到文件,所以这个也是个重要的操作啊!
    需要包含头文件<stdio.h>
    来一个小示例:

    #include <stdio.h>
    int main()
    {
    	FILE *fp;
    	int i = 0;
    	fp = fopen("e:/xxx.txt", "a");
    	while (i < 100)
    	{
    		fprintf(fp, "%d\n", i);
    		i++;
    	}
    	fclose(fp);
    }

    关于文件操作函数的一些说明:
    int fgetc(FILE *stream);//获取一个字符
    int fgetpos(FILE *stream,fpos_t *pos);//返回当前文件的位置
    char* fgets(char *s,int n,FILE *stream);//从文件流中读取字符串
    FILE* fopen(const char *path,const char *mode);//打开模式为r读取,w写入,a追加
    int fscanf(FILE *stream,const char *format,...);//按照格式获取数据

    展开全文
  • c语言文件

    2020-08-05 17:33:47
    1.C语言中的文件什么 文件(file)一般指存储在外部介质上数据的集合,比如我们经常使用的.txt, .bmp, jpg. .exe,.rmvb等等。这些文件各的用途,我们通常将它们存放在磁盘或者可移动盘等介质中。 注:文件一般包括...

    c语言(文件)

    今天刚学了文件,整理一些重要的东西防止遗忘

    1.C语言中的文件是什么

    文件(file)一般指存储在外部介质上数据的集合,比如我们经常使用的.txt, .bmp, jpg. .exe,.rmvb等等。这些文件各有各的用途,我们通常将它们存放在磁盘或者可移动盘等介质中。
    注:文件一般包括三要素:文件路径、文件名、后缀。
    文件路径: 由于在C语言中"一般是转义字符的起始标志,故在路径中需要用两个 ’ \ ‘表示路径中目录层次的间隔,也可以使用’ / '作为路径中的分隔符。
    eg:
    "D:\ \tulun\ \test.“或者"D:/tulun/test.c”,表示文件test.c保存在D盘tulun目录下。
    "test.txt表示当前目录下的文件test.txt.
    注: 带D:\ \或者D:/ 的为绝对路径,否则为相对路径。
    另:在C语言中,把这些输入和输出设备也看作"文件". stdin; stdout; stderr;

    2.流的概念及分类

    概念:
    程序绕过具体设备,直接与“标准逻辑设备"进行交互,这样就为程序设计者提供了一个不依赖于任何具体I/0设备的统一操作接口,通常把抽象出来的"标准逻辑设备"或"标准文件"称作""。
    分类:
    按方向分: 输入流和输出流。从文件获取数据的流称为输入流,向文件输出数据称为输出流。
    按数据形式分为: 文本流和二进制流。文本流是ASCIl码字符序列,而二进制流是字节序列。
    流较为抽象可以用下面图来理解
    在这里插入图片描述

    3.文本文件和二进制文件的区别

    文本文件: 把要存储的数据当成一系列字符组成,把每个字符的ASCI码值存入文件中。每个ASCII码值占一个字节,每个字节表示一个字符。故文本文件也称作字符文件或ASCI文件,是字符序列文件。
    二进制文件: 把数据对应的二进制形式存储到文件中。
    如图:
    在这里插入图片描述

    4.文件的具体操作

    C语言文件操作的步骤:
    打开文件→读写文件→关闭文件

    4.1打开函数fopen的原型:

    FILE * fopen (const char * filename, const char * mode);
    在这里插入图片描述
    其他的mode字符表示如下表
    在这里插入图片描述
    注: vs2019中fopen不可用,需要用fopen_s,具体使用例句。

    //FILE* fp = fopen_s("HYH.txt", "w");  //前面fopen的例句。
    FILE* fp = NULL;
    fopen_s(&fp, "NRJ.txt", "w");    //vs2019得用这个文件编辑语句 
    

    fopen_s的返回值可以参考下面链接:
    https://baike.baidu.com/item/fopen_s/6183225?fr=aladdin

    4.2关闭函数fclose的原型:

    原型int fclose (FILE stream );*
    在这里插入图片描述
    关闭文件的时候,数据才会真的写进硬盘。
    关闭fp的是时候此指针变为空悬指针,此时要将其只想NULL,不然很危险。

    4.2字符串格式化函数

    4.2.1原型int sprintf ( char * buff, const char * format, …);
    在这里插入图片描述
    eg:
    在这里插入图片描述
    4.2.2原型int fprintf ( FILE * stream, const char * format, …);
    在这里插入图片描述
    在这里插入图片描述
    fprintf写数据的时候数据并未写入文件里,数据只是写在了缓冲区里,只有关闭文件时,数据才会进入文件。

    展开全文
  • clion写了一个程序提示如下错误![图片说明]... 显示已经在其他项目定义过main函数,那么在clion中,创建两个文件什么指向的是一个main函数,没有解决方案的?
  • 追加就是在原有数据的后面继续添加数据。文件主名和扩展名可以使用的字符... //这些字符已做它用文件名字母大小写的区分:DOS下文件名不区分大小写。在Windows系统下,显示区分大小写,读写操作时不区分。在类Unix/L...
  • <p><img alt="" height="512" src=...
  • 不知道大家没有想过一个问题:C语言编译器为什么能够用C语言编写? 今天小编就带大家一探究竟! 所谓C语言编译器,就是把编程得到的文件,比如.c,.h的文件,进行读取,并对内容进行分析,按照C语言的规则,...
  • 这个问题问的好,一般静态语言与脚本语言(不仅仅是python),相互搭配,两种方式,一种是用c语言写好模块,然后python去整合,也被称之为扩展python,这样的好处是即python的灵活性,又有c语言的效率,还有一...
  • C语言什么是头文件

    2021-03-30 17:38:52
    之前我们经常可以看到一个程序的开头 #include也就是stdio.h这文件,这是一个名字叫stdio,后缀为.h的文件,其实和我们在日常的txt文本文件并无两样,都是我们能看懂的字符,只不过是英文而已,不信可以找到它看...
  • C语言的带参数的baimain函数格du式为main(int argc,char* argv[]),其中zhiargc为参数个数加1,argv为参数列表,dao从zhuanargv[1]开始。编译后生成可执shu行文件,可以在执行的程序后加参数,比如编译一个程序为...
  • 直至今天还人在喊着C语言都过时的语言了,还有什么值得去学的,看现在的python,php等语言现在起来多简单,谁还去学习老掉牙的C语言,事实真的是这样的吗?笔者作为专门下载了这两种语言的底层源码。由于篇幅的...
  • fgets方法读一个文件,结果到了这行G_SOCIAL_ID_U时,就莫名奇妙的变成了G_MB_REDUCE_CHK,其他的行读出来和都和文件一样,谁知道为什么
  • .h文件中的全局变量了static修饰,但被其它文件包含后,这个static全局变量还是可以被其它文件访问,那我声明为static有什么意义? 怎样才能让我的头文件在被其它文件包含后其中的全局变量不被这个文件访问到?
  • 一般情况下,你这两个语句运行的结果是相同的,没有区别,只有一下情况才区别: 运行你的程序的时候,命令行上把输出结果进行的转向,比如使用下面的命令把你的程序a.c运行的结果转向到记事本文件a.txt: a....
  • C语言中 .h文件和.c文件的区别 (转)

    万次阅读 多人点赞 2017-08-06 18:16:12
    要理解.c文件与.h文件有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,...
  • 要理解.c文件与.h文件有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:1.预处理阶段2.词法与语法分析阶段3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,...
  • \\C语言是实现SQLite的最佳语言,原因四:性能、兼容性、低依赖性、稳定性。\\性能\\像SQLite这样低级库速度必须要快。确实,SQLite的速度很快,甚至比文件系统要快上35%。\\C语言非常适合用来开发这...
  • 记得初中的时候MP3看电子书,MP3支持的文本文档格式不能超过1M,否则打不开,然后在网上下了一个文件分割器,感觉真的很强大啊(别吐槽,当时真的很白)。...有什么不足的,欢迎拍砖。 闲话少叙,直接
  • 人问:C语言什么只需要include<stdio.h>就能使用里面声明的函数?这是一个看起来非常简单的问题,但是很多初学者,甚至学了很久的人都可能没有搞明白。 为什么包含即可? 要明白包含即可的原因,就...
  • 从基础看起,.c中主要包括你要实现的函数,变量定义等,.h中...其实要理解C文件与头文件有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段...
  • 要理解.c文件与.h文件有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,...
  • 开、读取、写入和关闭文件的操作系统...其实做为一个学习者,一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C语言C++交流群1075673198,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。 2 为什么 SQL

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 747
精华内容 298
关键字:

c语言文件有什么用

c语言 订阅