c ++中的文件阅读问题

时间:2010-06-28 09:32:00

标签: c++ c windows

我有以下程序,

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。

请帮我解决这个问题。

3 个答案:

答案 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循环。

另一个问题是你没有检查文件中的字符是否符合预期。如果它不包含数字怎么办?