Форум программистов, компьютерный форум CyberForum.ru

Редактирование из таблицы - C++

Восстановить пароль Регистрация
 
digor
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 6
02.01.2010, 04:46     Редактирование из таблицы #1
Есть таблица
Нужно чтобы редастировать одну ячейку
Я вроди сделал код но он не меняет данные из ячейки
подскажите пожалуйста, где проблема...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
int edit()
{
int sel;
f = fopen("panificatia.inf","r+");
 
printf ("==============================================\n");
printf("\t Introdu RINDUL care urmeaza sa-l redactati: "); // Введи ряд 
scanf ("%d",&sel);
fflush(stdin);
printf("\n|===========================================================================|\n");
printf ("|------------------------ *** Ati selectat rindul %3d *** --------------------|\n",sel);
printf("|=============================================================================|\n");
printf ("| nr. |   produs     |   producator      |  masa | termen | ammbalaj   | pret |\n");
printf ("|     |              |                   |  (kg) | (zile) |            |(lei) |\n");
printf("|=============================================================================|\n");
            
      fseek(f,(sel-1)*sizeof(lista),SEEK_SET);
            fread(&lista,sizeof(lista),1,f);
            printf ("| %3d | %-12s | %-17s | %5.3d | %6d | %-10s | %4.2d |\n",
    sel,
    lista.nume_produs,
    lista.nume_producator,
    lista.greutatea,
    lista.durata,
    lista.ambalaj,
    lista.pret);
    fread(&lista,sizeof(lista),1,f);
    printf ("|-----------------------------------------------------------------------------|\n");
 
        printf ("\t Modifica numele produsului: "); // Введи названия для смены
        scanf ("$15s",lista.nume_produs);
        fseek(f,(sel-1)*sizeof(lista),SEEK_SET);
        fwrite(&lista,sizeof(lista),1,f);   
    
    fclose(f); exit(1);
 
}
и еше проблема
если не поставлю ексит в конце кода то он бесконечно спрашивает ряд и названия
где здесь ошибки?
Сасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
qwarta
 Аватар для qwarta
56 / 56 / 5
Регистрация: 20.11.2009
Сообщений: 213
03.01.2010, 13:44     Редактирование из таблицы #2
1.Нужно всегда проверять на ошибку открытия файла, иначе последующие действия становятся безсмысленны:
C
1
2
3
4
5
if((f = fopen("panificatia.inf","r+"))==NULL)
{
  printf("Ошибка открытия файла!\n");
  exit(1);
}
2.Как в программе объявлен lista? Судя по всему, это структура. Тогда как она заполняется? Ведь первым аргументом функции fread() должен быть массив. Так же как и функции fwrite().
digor
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 6
04.01.2010, 04:47  [ТС]     Редактирование из таблицы #3
Цитата Сообщение от qwarta Посмотреть сообщение
Как в программе объявлен lista? Судя по всему, это структура. Тогда как она заполняется? Ведь первым аргументом функции fread() должен быть массив. Так же как и функции fwrite().
Да, lista, это структура и она в новой библиотеке
newlib.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FILE *f;
   struct marfa 
    {
           char nume_produs[15];
           char nume_producator[15];
           long greutatea;
           long durata;
           char ambalaj[15];
           long pret;
          } lista;
          int i,n;
 
  #include "new_file.cpp"
  #include "afis.cpp"
  #include "add.cpp"
  #include "edit.cpp"
  #include "afis_sel.cpp"
а заполняется она так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
int creare()
{
    printf ("\t Cite produse introduceti: ");
    scanf ("%d",&n);
    
    f = fopen("panificatia.inf","w");
    for (i=0;i<n;i++)
    {
        printf ("\n================================================================\n");
        printf ("\t %d Introdu denumirea produsului: ",i+1); 
        scanf("%15s",lista.nume_produs);
        fflush(stdin);
        printf ("\t Introdu numele producatorului: "); 
        scanf("%15s",lista.nume_producator);
        fflush(stdin);
        printf ("\t Introdu greutatea produsului: "); 
        scanf("%d",&lista.greutatea);
        fflush(stdin);
        printf ("\t Introdu ambalajul:"); 
        scanf("%15s",lista.ambalaj);
        fflush(stdin);
        printf ("\t Introdu durata pastrarii: "); 
        scanf("%d",&lista.durata);
        fflush(stdin);
        printf ("\t Introdu costul produsului: "); 
        scanf("%d",&lista.pret);
        fflush(stdin);
        fwrite(&lista,sizeof(lista),1,f);
    }
    fclose(f);
    return 0;
}
и всетаки не понел какая проблема здесь....
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
04.01.2010, 08:13     Редактирование из таблицы #4
digor, Что бы точно узнать в чем у Вас проблема, нужна часть кода в которой идет вызов edit(). А лучше конечно весь код. Может быть проблема решится банально просто: попробуйте заменить в edit() вызов
C
1
exit(1);
в конце на
C
1
fflush(stdin);
qwarta
 Аватар для qwarta
56 / 56 / 5
Регистрация: 20.11.2009
Сообщений: 213
04.01.2010, 09:20     Редактирование из таблицы #5
В первом посте в функции scanf() не правильно задан спецификатор формата. Наверно нужно
C
1
scanf ("%15s",lista.nume_produs);
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
04.01.2010, 21:35     Редактирование из таблицы #6
C
1
fflush(stdin);
fflush работает только для потоков вывода
Gravity
 Аватар для Gravity
556 / 550 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
04.01.2010, 21:37     Редактирование из таблицы #7
Цитата Сообщение от accept Посмотреть сообщение
fflush работает только для потоков вывода
Практика показывает, что разработчики виндовых компиляторов грешат и делают возможность ффлаша даже для входного потока.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2010, 21:55     Редактирование из таблицы
Еще ссылки по теме:

Редактирование кода C++
C++ и редактирование PDF C++
C++ Редактирование записей

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
04.01.2010, 21:55     Редактирование из таблицы #8
Цитата Сообщение от digor
если не поставлю ексит в конце кода то он бесконечно спрашивает ряд и названия
а где функция main

Добавлено через 10 минут
Цитата Сообщение от Gravity
Практика показывает, что разработчики виндовых компиляторов грешат и делают возможность ффлаша даже для входного потока.
да пускай делают, главное, что это юзать никто не обязан, а неопределённое поведение - у меня isdigit вообще выпадала на большом числе

вот что-то подобное

C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <ctype.h>
 
int main(void) /* C89 ANSI */
{
    int n = -1000;
    
    printf("%d" "\n", isalpha(n));
    return 0;
}
Код
вывод
[guest@station src]$ ./test
1024
[guest@station src]$


Добавлено через 3 минуты
во

C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <ctype.h>
 
int main(void) /* C89 ANSI */
{
    int n = -200000000000;
    
    printf("%d" "\n", isalpha(n));
    return 0;
}
вывод
Код
[guest@station src]$ ./test
Ошибка сегментирования
[guest@station src]$


Добавлено через 2 минуты
а без printf'а работает

Добавлено через 1 минуту
во прикол

C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <ctype.h>
 
int main(void) /* C89 ANSI */
{
    int n = -200000000000;
    int m;
    
    m = isalpha(n);
    return 0;
}
вывод
Код
[guest@station src]$ ./test
Ошибка сегментирования
[guest@station src]$
Yandex
Объявления
04.01.2010, 21:55     Редактирование из таблицы
Ответ Создать тему
Опции темы

Текущее время: 02:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru