Проблема с чтением файлов в c ++ - PullRequest
0 голосов
/ 28 июня 2010

У меня есть следующая программа,

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 ]

5 голосов
/ 28 июня 2010

Вы записываете 5 символов в массив cPort. Это нормально. Но затем вы используете cPort в качестве параметра функции atoi. Эта функция ожидает строку с нулевым символом в конце в качестве аргумента. Поскольку в вашей переменной cPort нет места для хранения этого символа нулевого значения, указывающего конец строки, ваш код зависит от того, что находится после переменной cPort в памяти.

Самый простой способ решить вашу проблему - определить cPort как массив из 6 символов и присвоить 0 cPort[5] непосредственно перед вызовом atoi. Но это не решит другие проблемы вашего кода, главное не проверять, имеет ли число, которое вы читаете из файла, более 5 цифр.

0 голосов
/ 28 июня 2010

Эта программа - нечто вроде катастрофы, ожидающей своего появления.Изменение массива cPort на длину 6 очень хорошо, но что если кто-то поместит что-то более длинное в FileName.txt?У вас есть мгновенное переполнение буфера и серьезная проблема безопасности.

Если вы ожидаете прочитать не более 5 символов, убедитесь, что программа читает не более 5 символов.Это означает завершение цикла while до достижения EOF, если это необходимо.

Другая проблема заключается в том, что вы не проверяете, соответствуют ли символы из файла тем, что вы ожидаете.Что если он не содержит цифр?

0 голосов
/ 28 июня 2010

Согласен с Дидье Троссе.

Еще одно примечание: в цикле while вы фактически проверяете переменную cFileChar в первый раз, прежде чем присваиваете ей любое допустимое значение. Следовательно, ваша программа может удивить вас еще раз.

Вы должны либо инициализировать его некоторым значением (отличным от EOF), либо изменить цикл на do - while.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...