今天在学习文件输入/输出一章时使用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这两个宏。
方法二:干粹在工程属性中设置(推荐)。
在工程属性中设置的方法如下:
对于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这两个宏。