C语言——小细节和小知识6

发布时间:2023年12月23日

一、转义字符相关

\? ? ? ? 反斜杠,转义字符中的转义序列符?

\?? ? ? ? 将?转义,防止他被识别成三字母词(很早的东西)中的问号

//三字母词
//??(是[
//??)是]
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"模式打开一个文件时,所有的写入操作都会在文件的末尾进行,即便在打开文件后我们用fseekrewind改变了文件位置。如果文件不存在,使用"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", &dividend, &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语言的fopenfclose函数和system函数共同操作一个文件,那么应该在fclose之后使用system函数。

fopenfclose函数用于打开和关闭文件流。当你使用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;
}

文章来源:https://blog.csdn.net/stewie6/article/details/135069896
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。