关于VS中各种不安全函数的处理办法

  今天在学习文件输入/输出一章时使用fopen()时报错,VS中应该使用fopen_s而不是fopen。 fopen()的函数原型是FILE * fopen(const char * path, const char * mode)。 

int main(int argc , char*argv[])
{ 
FILE *in; 
char name[LEN]; 
if((in=fopen(argv[1],"r"))==NULL) 
{exit}; 

return 0
} 

文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回 NULL,并把错误代码存在 error 中
fopen_s的函数原型是errno_t fopen_s( FILE** pFile, const char *filename, const char *mode )即
int main(int argc, char *argv[])
{
	FILE *in, *out;
	int ch;
	char name[LEN];
	int count = 0;
	errno_t err;

	if (argc < 2)
	{
		fprintf(stderr, "Usage: %s filename\n", argv[0]);
		exit(EXIT_FAILURE);
	}
	//设置输入
	if ((err = fopen_s(&in, argv[1], "r")) != 0)
	{
		fprintf(stderr, "I couldn't open the file \"%s\"\n", argv[1]);
		exit(EXIT_FAILURE);
	}
	//设置输出
	strncpy_s(name, argv[1], LEN - 5);
	name[LEN - 5] = '\0';
	strcat_s(name, ".red");
	if ((err = fopen_s(&out, name, "w")) != 0)
	{
		fprintf(stderr, "Can't create output file.\n");
		exit(3);
	}
	//拷贝数据
	while ((ch = getc(in)) != EOF)
		if (count++ % 3 == 0)
			putc(ch, out);
	//收尾
	if (fclose(in) != 0 || fclose(out) != 0)
		fprintf(stderr, "Error in closing files\n");


    return 0;
}

懒得一行行输了,直接复制了一个源码
其实这些_s函数都是微软自己搞出来的一些东西,至于安全性还是靠程序员自身水平,如果程序不仅仅在windows上用,那么要保证可移植性,如果不考虑可移植性直接调用VS2005鼓吹的那些带“_s”后缀的非标准函数,即在其后加上"_S",如sprintf改为sprintf_s    。
方法一:在文件最开始添加#define _CRT_SECURE_NO_DEPRECATE或#pragma warning(disable:4996)     ,这是忽略警告的方法(一般比较少用)。
方法二:干粹在工程属性中设置(推荐)。

在工程属性中设置的方法如下:

对于VC6:
打开Project----settings----Resources----Preprocessor definitions,
添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE这两个宏。


对于VS系列的版本:
打开项目----项目属性---配置属性----C/C++ ----预处理器----预处理定义,
添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE这两个宏。

你可能感兴趣的:(C语言学习)