застряла в цикле while. нужно с файла считать число, которое стоит перед английской С

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
bstrd6
Сообщения: 3
Зарегистрирован: 19 май 2017, 21:52

19 май 2017, 21:56

Код: Выделить всё

int main() 
{ 
FILE *fp; 
float farengheit; 
int i = 0, C = 0, g, a = 0, size = 100, newNum; 
char curstr[100] = ""; 
char *filename = "C:\\Users\\User\\Desktop\\lab.txt"; 





if (!fopen_s(&fp, filename, "r")) 
while (fscanf_s(fp, "%c", curstr[size]) != EOF) 
{ 


for (i = 0; i < size; i++) 

{ 
g = i; 
newNum = 0; 
a=0;
if (curstr[i] = 'C') 
{ 
while ((curstr[g] != ' ') && curstr[g] != '\n' && (g >= 0)) 
{ 

if (((int)curstr[i] < (int)'0') && ((int)curstr[i] > (int)'9')) 
a++; 
 
} 


if (a == 0) 
{ 

for (g; g<i; g++) 
newNum = (((int)curstr[g] - 48) * pow(10, g - 1)); 
a++; 
} 
printf("%d", newNum); 
} 
} 

getchar(); 
return 0; 
} 
else 
{ 
printf_s("can`t open this"); 
} 
}
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

19 май 2017, 23:19

Во-первых, обращение к curstr[size] некорректно, так как у массива элементы имеют индексы от 0 до size-1.
Во-вторых, функция fscanf должна принимать адрес памяти, в которую она будет записывать результат, ты же ей передаёшь значение.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
bstrd6
Сообщения: 3
Зарегистрирован: 19 май 2017, 21:52

20 май 2017, 08:34

Romeo писал(а):Во-первых, обращение к curstr[size] некорректно, так как у массива элементы имеют индексы от 0 до size-1.
Во-вторых, функция fscanf должна принимать адрес памяти, в которую она будет записывать результат, ты же ей передаёшь значение.

То есть мне нужно написать ..., curstr, size?
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

20 май 2017, 11:16

Нет, нужно начинать обход c size-1, а не с size.
По второму пункту вопросов не возникло?

Посмотрел оставшийся код... там вообще чёрт ногу сломит. Что вообще он должен был делать по задумке? В таком виде, в котором он сейчас записан он работать не будет. Недостаточно поправить отдельные места, код нужно просто полностью переписать.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
bstrd6
Сообщения: 3
Зарегистрирован: 19 май 2017, 21:52

20 май 2017, 16:12

Romeo писал(а):Нет, нужно начинать обход c size-1, а не с size.
По второму пункту вопросов не возникло?

Посмотрел оставшийся код... там вообще чёрт ногу сломит. Что вообще он должен был делать по задумке? В таком виде, в котором он сейчас записан он работать не будет. Недостаточно поправить отдельные места, код нужно просто полностью переписать.

Перевести все мерные температуры из цельсия в фаренгейт. Пример: 210C = 410F
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

20 май 2017, 18:53

В общем, на твоём месте я бы это полностью переписал, так как в программе огромное количество ошибок.

Если же ответа требует вопрос, почему ты не выходишь из внешнего while, то ответ прост. Функция fscanf возвращает количество прочтённых байт. А так как оно будет всегда либо 1, либо 0, то условие никогда не выполнится, так как EOF обычно равен -1.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить