一、转义字符相关
\ 反斜杠,转义字符中的转义序列符
\? 将?转义,防止他被识别成三字母词(很早的东西)中的问号
//三字母词
//??(是[
//??)是]
printf("%s","??(??)");
//打印结果是[]
二、fopen函数fclose函数
fopen
以及fclose
这两个函数都是定义在C语言的stdio.h
标准输入/输出头文件中的。
1、fopen
fopen
是用于打开文件,可以设置文件的打开方式,如只读,写入,追加等。
在C语言中,我们通过fopen()
函数来打开一个文件,并设置相应的操作模式。这三种操作模式,即只读,写入,追加,对应到fopen()
函数中的参数,它们分别是"r", "w", "a"。
(1)只读模式("r"):只允许读取文件,不允许写入。如果文件不存在,则打开失败。
FILE *file = fopen("filename", "r");
(2)写入模式("w"):打开文件进行写入。如果文件已存在,其内容会被清空,重新写入新的内容。如果文件不存在,会创建一个新文件。
这个文件会被创建在程序的当前运行目录中。当前运行目录通常是你从命令行启动程序的那个目录。
例如,如果你在命令行中导航到了"C:\Users\YourUsername\Documents\CProjects"目录并从那里运行程序,那么文件 "fprintf.out" 将会被创建在"C:\Users\YourUsername\Documents\CProjects"目录下。
请注意,这可能会根据你的操作系统和编程环境有所不同。在某些环境中,程序的运行目录可能会被设置为其它位置,如程序的二进制文件所在的目录,或者特定的工作目录。在这种情况下,"fprintf.out"文件将会被创建在这些目录之一。
如果你想要将文件创建在特定的位置,你可以在文件名中包含完整的路径,如 "C:\path\to\your\directory\fprintf.out"。
FILE *file = fopen("filename", "w");
(3)追加模式("a"):打开文件进行写入,但是写入的数据会被追加到文件的末尾。如果文件不存在,会创建一个新文件。
在C语言中,fopen
函数的打开模式参数"a"代表"append",这是英文单词"追加"的意思。当我们以"append"模式打开一个文件时,所有的写入操作都会在文件的末尾进行,即便在打开文件后我们用fseek
或rewind
改变了文件位置。如果文件不存在,使用"append"模式会创建一个新的文件。这使得我们能在不删除文件现有内容的情况下添加新的数据。
FILE *file = fopen("filename", "a");
在完成文件操作后,别忘了使用fclose()
函数来关闭文件,释放系统资源。
fclose(file);
这是一个良好的编程习惯。
file是一个FILE类型的指针变量,用来接收fopen的文件流,后面可以通过fprintf函数进行写入内容。
除了单一的"r"(只读模式)、"w"(写入模式)和"a"(追加模式)之外,还有一些模式是在这些基础上添加了"+"字符,以支持同时进行读写操作,这就是我们所说的组合模式。具体来看:
- "r+": 以读写模式打开文件。你既可以从文件中读取数据,也可以向文件中写入数据。如果文件不存在,则打开失败。即打开一个已经存在的文件,允许读取和写入。文件指针被设置在文件的开头。
- "w+": 以读写模式打开文件,如果文件已存在,其内容会被清空。如果文件不存在,会创建一个新文件。即打开一个新文件,或者已存在的文件,允许读取和写入。如果文件已存在,它的内容会被清空。
- "a+": 以读写模式打开文件,如果文件已存在,写入的数据会被添加到文件的末尾。如果文件不存在,会创建一个新文件。即打开一个已存在的文件,或者新文件,并允许读取和在文件的末尾追加内容。如果文件不存在,会被创建。
2、fclose
fclose()
是一个C语言标准库函数,它的作用是关闭已打开的文件。这个函数出现在stdio.h
头文件中。关闭文件在处理文件时非常重要,因为它可以帮助释放系统资源,防止数据丢失和其他可能的问题。
fclose()
函数的原型如下:
int fclose(FILE *stream);
这里的参数stream
是一个文件指针,指向你想要关闭的文件。函数会返回一个整数。如果文件成功关闭,函数会返回零;如果发生错误,函数会返回EOF。
使用fclose()
的一个典型例子如下:
FILE *file = fopen("filename", "r");
if (file != NULL)
{// 在此处进行文件操作.....// 完成后关闭文件if (fclose(file) == 0) {printf("文件已成功关闭.\n");} else {printf("关闭文件时出错.\n");}
}
这段代码尝试打开一个名为"filename"的文件进行读取,如果文件成功打开,它会进行一些文件操作,然后尝试关闭文件。如果文件关闭成功,它会输出“文件已成功关闭”,否则,它会输出“关闭文件时出错”。
三、fprintf函数
1、实际文件的文件流
fprintf
这个函数是定义在C语言的stdio.h
标准输入/输出头文件中的。
fprintf
函数是C语言中的一个标准库函数,用于将格式化的数据输出到指定的文件中。函数名中的"f"代表"file","printf"代表"print formatted",即"向文件打印格式化数据"。
fprintf
函数的原型如下:
int fprintf(FILE *stream, const char *format, ...);
其中:
-
stream
:这是一个指向FILE
类型的指针,代表要输出数据的文件流。这个文件流通常是由fopen
函数打开的。 -
format
:这是一个字符串,定义了要输出的数据的格式。这个字符串可以包含一些特殊的格式化符号,比如%d
(输出整数)、%f
(输出浮点数)、%c
(输出字符)和%s
(输出字符串),以及其他一些用于控制输出格式的符号。 -
...
:这是一系列可变的参数,这些参数的类型和数量应与格式化字符串中的格式化符号相对应。
fprintf
函数会将格式化的数据输出到指定的文件中,然后返回一个整数,表示输出的字符数。如果发生错误,它会返回一个负值。
例如,下面的代码会把一个整数和一个浮点数写入到一个名为"output.txt"的文件中:
FILE *file = fopen("output.txt", "w");if (file != NULL)
{int i = 123;float x = 456.789f;fprintf(file, "Integer: %d, Float: %.2f\n", i, x);fclose(file);
}
这将在文件中生成如下的文本:
Integer: 123, Float: 456.79
在这个例子中,文件output.txt
是由fopen
函数创建的。在调用fopen
函数时使用"w"
(write)模式,如果文件不存在,就会创建一个新文件。如果文件已经存在,那么"w"
模式会清空文件内容,以便开始新的写入。所以,这段代码执行后,就会在相应的位置生成一个名为output.txt
的文件。
这里的:
if (file != NULL)
这个判断是很重要的。当尝试打开一个文件进行读写操作时,如果因为某些原因(例如文件不存在,或者没有足够的权限来访问文件)文件打开失败,fopen
函数会返回 NULL
。如果在没有进行这个判断的情况下继续尝试使用这个 NULL
文件指针进行读写操作,将会导致程序出错,甚至可能会使你的程序崩溃。
因此,当我们使用 fopen
函数打开文件后,通常我们会检查返回的文件指针是否为 NULL
。如果文件指针为 NULL
,我们就知道有一些问题阻止了文件的打开,我们需要处理这个错误,而不是继续进行可能会导致程序崩溃的读写操作。
这是一个良好的编程实践,以确保你的程序在遇到错误时能以恰当的方式来反应,而不是简单地崩溃或产生不确定的行为。
2、其他文件流中
fprintf不止可以输出数据到实际文件的文件流中,也可输出数据到其他文件流中,例如stderr文件流中,在Windows系统中,和其他操作系统一样,stderr
(标准错误)并不是一个物理文件,而是一个指向特定设备(通常是显示器)的文件流。当你运行一个程序时,stderr
的内容默认会显示在命令行或终端窗口中。
stderr
是标准错误输出流的别名,它是C和许多其他编程语言中的一个预定义的文件指针。stdout
是标准输出流,通常用于输出程序的结果,而stderr
则用于输出错误信息。
#include <stdio.h>int main()
{int dividend = 0;int divisor = 1;scanf("%d %d", ÷nd, &divisor);if (divisor == 0){fprintf(stderr,"divisor can not be zero!");}else{double res = dividend * 1.0 / divisor;printf("%lf", res);}return 0;
}
这里只要除数是0,就输出"divisor can not be zero!"这个信息到标准错误输出流中。
四、使文件中内容打印到shell中
system( "type output.out" );
:调用系统命令行(shell)来执行 "type output.out" 命令,这个命令在Windows系统中用于在命令行窗口显示文件的内容。
#include <stdio.h>
#include <stdlib.h>int main()
{FILE *file = fopen("output.txt", "w");if (file != NULL)//判断是否为空指针{int i = 123;float x = 456.789f;fprintf(file, "Integer: %d, Float: %.2f\n", i, x);fclose(file);}system("type output.txt");return 0;
}
如果在使用C语言的fopen
和fclose
函数和system
函数共同操作一个文件,那么应该在fclose
之后使用system
函数。
fopen
和fclose
函数用于打开和关闭文件流。当你使用fopen
函数打开一个文件时,这个文件就会被锁定,防止其它的应用或进程同时访问。如果在fclose
之前使用system
函数尝试访问这个文件,可能会因为文件被锁定而无法访问。
因此,建议在关闭文件流,即在fclose
函数调用之后,再使用system
函数。这样可以确保system
函数能够正常访问和操作文件。
需要注意的是,system
函数需要在已经设置好PATH的环境中运行,并且它的效率相对较低,因为它需要创建一个子进程并加载shell来执行命令。在安全性要求较高的场合,也应该尽量避免使用system
函数,以防止命令注入攻击。
五、fscanf函数
对于fopen的三个模式,其中有两个是用于fprintf的,即"w"写入和"a"追加模式,两种模式都可以用fprintf向这个文件写入数据;另外一个模式,即"r"只读模式是用于fscanf的,可以用fscanf函数读出文件中的数据。
fscanf
函数是C语言标准库中的一个函数,用于从文件流中读取格式化输入。它的原型如下:
int fscanf(FILE *stream, const char *format, ...);
其中:
stream
是要读取的文件流,通常是使用fopen
函数打开的。format
是一个格式字符串,定义了要读取的数据的类型和顺序。例如,"%d %s %f"
会读取一个整数,一个字符串和一个浮点数。...
是要读取数据的变量的指针,数量和顺序应与format
参数中的转换说明符相对应。
函数成功返回时返回成功读取的项数。如果到达文件末尾或发生读取错误,它将返回EOF
。
以下是使用fscanf
的一个例子:
#include <stdio.h>int main()
{FILE* file = fopen("read.txt", "r");if (file == NULL){printf("无法打开文件\n");return 1;}int i;float f;while (fscanf(file, "%d %f", &i, &f) == 2){printf("读取到的数据: %d %f\n", i, f);}fclose(file);return 0;
}