当我们在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
答案 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));