Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2011, 00:35   #1
Nox4o
Новичок
Джуниор
 
Регистрация: 24.05.2011
Сообщений: 4
По умолчанию Немогу найти ошибку в задаче на Си.

Язык: "Си"
Задача: "Создать файл, содержаший сведения о месячной зарплате N рабочих завода. В файле содержатся сведения: фамилия рабочего, наименование цеха, размер зарплаты за меся. Имя файла передается через командную строку. "

Код:
#include <stdio.h>
#include <windows.h>

int main(int argc, char *argv[])
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    int n=0,i=0; 
    char sod[100],
         nline='\n';
    
    printf("введите количество рабочих \n");
    scanf("%d", &n);
    
    FILE *pFile;
    pFile = fopen (argv[1],"w+");
    
    if ((pFile = fopen (argv[1],"w+"))==NULL) 
     {
               printf("неудалось открыть файл\n");
               return 1;
     }
    
    for(i=0; i<n; i++)
     {
      printf("введите имя %d рабочего завода, намер его цеха и зарплату за месяц \n", i+1);
      gets(sod);
      fputs(sod, pFile );
      fputc(nline, pFile);
     }
    
  fclose(pFile);
    
    system("pause");
 return 0;
}
Когда запускаю, получаю:

введите количество рабочих
2
введите имя 1 рабочего завода, намер его цеха и зарплату за месяц
введите имя 2 рабочего завода, намер его цеха и зарплату за месяц
_

Тоесть он как бы перескакивает через 1 шаг, ведь после строчки
"введите имя 1 рабочего завода, намер его цеха и зарплату за месяц" , он должен ждать пока я чтонить ему введу, а он сразу же выводит "введите имя 2 рабочего завода, намер его цеха и зарплату за месяц" , и только потом ждет ввода.
Неподскажете в чем дело?

P.S Постарался как можно конкретнее описать проблему, так что извините за "многа букв"
Nox4o вне форума Ответить с цитированием
Старый 25.05.2011, 01:52   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Интересная ошибка.

Все дело в том, как взаимодействуют функции scanf и gets.

Для начала ты считываешь число с помощью scanf - после этого во входном буфере остается необработанный перевод строки (\n), ты же нажимал энтер.

Дальше ты вызываешь gets. Она считывает строку до того момента, пока не встретит \n. И встречает его сразу же, не дожидаясь твоего ввода. Потому первая итерация цикла "проскакивает".

Проще всего здесь перед циклом вставить лишний вызов gets(sod), ну или использовать во всех случаях scanf.
Да, и зачем ты два раза вызываешь fopen?

Последний раз редактировалось Son Of Pain; 25.05.2011 в 02:03.
Son Of Pain вне форума Ответить с цитированием
Старый 25.05.2011, 12:17   #3
Nox4o
Новичок
Джуниор
 
Регистрация: 24.05.2011
Сообщений: 4
По умолчанию

Большое спасибо все работает!

Цитата:
Да, и зачем ты два раза вызываешь fopen?
Эмм.. либо я дурак, либо лыжи не едут. Я вроде только 1 раз fopen вызываю.
Nox4o вне форума Ответить с цитированием
Старый 25.05.2011, 13:11   #4
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Код:
pFile = fopen (argv[1],"w+");

if ((pFile = fopen (argv[1],"w+"))==NULL)
Все же два )
Son Of Pain вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
найти ошибку в задаче! dark999 Помощь студентам 4 25.03.2011 15:15
Немогу найти ошибку gufon Общие вопросы Delphi 1 03.03.2011 22:24
немогу найти ошибку mojohead Помощь студентам 13 13.01.2011 00:30
немогу найти ошибку hunter03 Помощь студентам 0 07.12.2010 19:35
НАйти ошибку в задаче dragun4ik Помощь студентам 6 29.06.2010 23:24