我有以下程序,
int iIndex=0;
char cPort[5]={"\0"};
char cFileChar;
fopen_s(&fFile,"c:\\Config\\FileName.txt","r");
if(fFile !=0)
{
cFileChar = getc(fFile);
while (cFileChar!= EOF)
{
cPort[iIndex]=cFileChar;
iIndex++;
cFileChar = getc(fFile);
}
iDIPort=atoi(cPort);
}
在文件中我有32000,但是当程序执行并从文件中读取时,其读取正常并将iDIPort设置为32000但有时它将变量值设置为320000。
请帮我解决这个问题。
答案 0 :(得分:5)
您将5个字符写入cPort数组。没关系。但是,您使用cPort作为atoi函数的参数。此函数需要一个C zero-terminated-string作为参数。由于您的cPort变量没有空间来存储此零值char以指示字符串的结尾,因此您的代码取决于内存中cPort变量之后的内容。
解决问题的最简单方法是将cPort定义为包含6个字符的数组,并在调用0
之前将cPort[5]
分配给atoi
。但这不会解决你的代码的其他问题,主要是不检查你从文件中读取的数字是否有超过5个数字。
答案 1 :(得分:0)
同意Didier Trosset。
另一个注意事项:在while
循环中,您在为其分配任何有效值之前首次实际检查cFileChar
变量。因此,您的计划可能会再次让您大吃一惊。
您应该将其初始化为某个值(EOF
除外)或将循环更改为do
- while
。
答案 2 :(得分:0)
这个程序有点像等待发生的灾难。将cPort
数组更改为长度6非常好,但如果有人将更长的内容放入FileName.txt
会怎么样?你有自己的即时缓冲区溢出和主要的安全问题。
如果您希望最多读取5个字符,请确保程序读取的字符数不超过5个。这意味着在必要时,在达到EOF之前终止while循环。
另一个问题是你没有检查文件中的字符是否符合预期。如果它不包含数字怎么办?