fscanf_s在Winserver2008 VS2013 64bit中无法正常工作

时间:2015-04-24 07:53:57

标签: c++ visual-c++ visual-studio-2013 64-bit windows-server-2008-r2

当我们在Visual Studio 2013(C ++控制台应用程序),Os- Winsever2008(64位)中使用fscanf_s方法时,文件指针会提前读取一个或两个字节的数据。 例如:在读取文本文件时,文件的第二行是“Administartor”,但fscanf_s()将单词返回为“dministrator”。 请帮我纠正这个问题。 使用Visual Studio 2008,代码在WIndows XP 32位上运行良好。

FILE* pFile;
pFile = NULL;
string strFile = "E:\\10_Products.lrf";
fopen_s(&pFile, strFile.c_str(), "r");
char szTemp[256];
string strTemp = "";
if (NULL != pFile)
{   
    while (!feof(pFile))
    {
        nRet = fscanf_s(pFile, "%s", szTemp);
        if (EOF == nRet)
        {
            cout << "EOF detected";
        }
    }
    return 0;
}

10_Products.lrf文件的格式如下。

[OPERATOR_LEVEL]
Administrator

1 个答案:

答案 0 :(得分:0)

来自fscanf_s()的文档,http://msdn.microsoft.com/en-us/library/6ybhk9kc.aspx

The main difference between the secure functions (with the _s suffix) and the older functions is that the secure functions require the size of each c, C, s, S and [ type field to be passed as an argument immediately following the variable. For more information, see scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l and scanf Width Specification.

http://msdn.microsoft.com/en-us/library/w40768et.aspx

Unlike scanf and wscanf, scanf_s and wscanf_s require the buffer size to be specified for all input parameters of type c, C, s, S, or [. The buffer size is passed as an additional parameter immediately following the pointer to the buffer or variable. For example, if reading a string, the buffer size for that string is passed as follows:

char s[10];

scanf("%9s", s, 10);

所以你应该这样称呼它:

fscanf_s(fp,“%80s”,cmd,sizeof(cmd));