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

Динамический массив строк. Ввод / вывод - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
gluck-a
0 / 0 / 0
Регистрация: 28.05.2010
Сообщений: 23
31.05.2010, 05:59     Динамический массив строк. Ввод / вывод #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
39
void del(void)
{
    FILE *BD;
    Persson p;
    int IDbuf=1,i=0;
    
BD=fopen("d:\BD.dat","r");
        
        fscanf(BD,"%d%s%s%lf",&p.ID,p.lastName,p.firstName,&p.Oklad);
        while(!feof(BD))
        {
        fscanf(BD,"%d%s%s%lf",&p.ID,p.lastName,p.firstName,&p.Oklad);
        IDbuf++;
        }
        fclose(BD);
 
 
char **mas = new char*[256];
if ((BD=fopen("d:\BD.dat","r"))==NULL)
    {
        printf("Не возможно открыть фал BD.txt\n");
        return;
    }
        fscanf(BD,"%d%s%s%lf",&p.ID,p.lastName,p.firstName,&p.Oklad);
        mas[p.ID] = new char[p.ID,p.lastName,p.firstName,p.Oklad];
        while(!feof(BD))
        {
        mas[p.ID] = new char[p.ID,p.lastName,p.firstName,p.Oklad];
        fscanf(BD,"%d%s%s%lf",&p.ID,p.lastName,p.firstName,&p.Oklad);
        }
 
printf("ВВедите ID работника которого хотите удалить\n");
cin>>i;
delete mas[i];
 
for(i=0;i<IDbuf-1;i++) 
    printf("%s\n",mas);
 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
so1o
33 / 33 / 2
Регистрация: 16.11.2009
Сообщений: 192
31.05.2010, 10:25     Динамический массив строк. Ввод / вывод #2
Цитата Сообщение от gluck-a Посмотреть сообщение
C
1
char **mas
может потому что mas - двойной указатель?
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
31.05.2010, 10:44     Динамический массив строк. Ввод / вывод #3
Цитата Сообщение от gluck-a Посмотреть сообщение
удалил нужную строку в массиве
в массиве вы ничего не удалили
после удаления строки нужно сдвигать остальные строки
gluck-a
0 / 0 / 0
Регистрация: 28.05.2010
Сообщений: 23
31.05.2010, 13:19  [ТС]     Динамический массив строк. Ввод / вывод #4
я профан а как?
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
31.05.2010, 13:28     Динамический массив строк. Ввод / вывод #5
C++
1
2
3
4
5
6
7
    int count = 4; // общее ко-во
 
    int del_num = 2; // удаляемый
    delete mas[del_num];
    for (int i=del_num; i<count-1; i++)
        mas[i] = mas[i+1];
    count--;
gluck-a
0 / 0 / 0
Регистрация: 28.05.2010
Сообщений: 23
31.05.2010, 13:43  [ТС]     Динамический массив строк. Ввод / вывод #6
спасибо, но вс ровно выдаёт обракодабру, я в массив строки по моему не правильно передаю...
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
31.05.2010, 13:57     Динамический массив строк. Ввод / вывод #7
а это уже другой вопрос
C++
1
2
mas[p.ID] = new char[_длина_строки_];
... заполнение строки
gluck-a
0 / 0 / 0
Регистрация: 28.05.2010
Сообщений: 23
31.05.2010, 14:40  [ТС]     Динамический массив строк. Ввод / вывод #8
что то поисковики не помогают(( помоги пожалуйста, вообщем в строку надо записать 4 переменные, но они разных типов
C++
1
2
mas[p.ID] = new char[256];
mas[p.ID]= (char)(p.ID,p.lastName,p.firstName,p.Oklad);
p.ID, -int
p.lastName -char
p.firstName -char
p.Oklad - double
и наверно через пробел их лучше записать, что б потом читать было удобно.
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
31.05.2010, 15:11     Динамический массив строк. Ввод / вывод #9
C++
1
2
mas[p.ID] = new char[256];
sprintf(mas, "%d %s %s %.3lf", p.ID, p.lastName, p.firstName, p.Oklad);
gluck-a
0 / 0 / 0
Регистрация: 28.05.2010
Сообщений: 23
31.05.2010, 15:29  [ТС]     Динамический массив строк. Ввод / вывод #10
ошибку вызывает - (error C2664: 'sprintf' : cannot convert parameter 1 from 'char **' to 'char *')
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
31.05.2010, 15:45     Динамический массив строк. Ввод / вывод #11
sprintf(mas[p.ID], ....
gluck-a
0 / 0 / 0
Регистрация: 28.05.2010
Сообщений: 23
31.05.2010, 18:49  [ТС]     Динамический массив строк. Ввод / вывод #12
нет-нет, это все верно это организация массива такая.
блинн)) не туда)) и не удаляется)))
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
31.05.2010, 18:55     Динамический массив строк. Ввод / вывод #13
при чём тут организация
я первый раз неправильно написал
C++
1
sprintf(mas, "%d %s %s %.3lf", p.ID, p.lastName, p.firstName, p.Oklad);
а нужно
C++
1
sprintf(mas[p.ID], "%d %s %s %.3lf", p.ID, p.lastName, p.firstName, p.Oklad);
gluck-a
0 / 0 / 0
Регистрация: 28.05.2010
Сообщений: 23
31.05.2010, 18:58  [ТС]     Динамический массив строк. Ввод / вывод #14
да я вообще не сюда это хотел написать))) то что ты написал я понял, оно заработало)) тока всеровно делает не то что мне надо(((

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
39
40
41
42
43
44
45
46
47
void del(void)
{
    FILE *BD;
    Persson p;
    int IDbuf=1,i=0,x;
    
BD=fopen("d:\BD.dat","r");
        
        fscanf(BD,"%d%s%s%lf",&p.ID,p.lastName,p.firstName,&p.Oklad);
        while(!feof(BD))
        {
        fscanf(BD,"%d%s%s%lf",&p.ID,p.lastName,p.firstName,&p.Oklad);
        IDbuf++;
        }
        //printf("Буфер ID = %d\n",IDbuf);
        fclose(BD);
 
char **mas = new char*[IDbuf];
if ((BD=fopen("d:\BD.dat","r"))==NULL)
    {
        printf("Не возможно открыть фал BD.txt\n");
        return;
    }
        fscanf(BD,"%d%s%s%lf",&p.ID,p.lastName,p.firstName,&p.Oklad);
        mas[p.ID] = new char[256];
        sprintf(mas[p.ID], "%d %s %s %.2lf", p.ID, p.lastName, p.firstName, p.Oklad); 
        while(!feof(BD))
        {
        mas[p.ID] = new char[256];
        sprintf(mas[p.ID], "%d %s %s %.2lf", p.ID, p.lastName, p.firstName, p.Oklad);  
        fscanf(BD,"%d%s%s%lf",&p.ID,p.lastName,p.firstName,&p.Oklad);
        }
 
printf("ВВедите ID работника которого хотите удалить\n");
 
//cin>>x;
 
    
 //delete mas[x];
 //for (int i=x; i<IDbuf-1; i++)
//    mas[i] = mas[i+1];
// IDbuf--;
 
for(i=0;i<IDbuf;i++) 
    printf("%s\n",mas);
 
}
Миниатюры
Динамический массив строк. Ввод / вывод  
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
31.05.2010, 21:27     Динамический массив строк. Ввод / вывод #15
в цикле while перепутано - fscanf после sprintf (правильно сделано до цикла)

и выводится не то
C++
1
2
for(i=0;i<IDbuf;i++) 
    printf("%s\n",mas[IDbuf]);
Добавлено через 1 минуту
да и вообще непонятно как оно с файла считывается и куда
первый раз всё идёт в одну "p" ("IDbuf++" ни на что не влияет)
второй в mas[p.ID] - p.ID в цикле не меняется
gluck-a
0 / 0 / 0
Регистрация: 28.05.2010
Сообщений: 23
01.06.2010, 14:07  [ТС]     Динамический массив строк. Ввод / вывод #16
цикл организован правильно, уверяю Вас, это 100%, у меня функции остальные по тому же принцепу построены и работают)
Сама "р"- это переменная класса Persson.
p.ID меняется, она каждый раз со строки считывает, а там в столбик в файле 1,2,3 и т.д.
По тому же принцепу организовал добавление записей, работает.
эти ид прога сама ставит, то есть читает строки и записывает IDbuf.
Возможно в этой функции с IDbuf что то напортачил, вот сейчас пытаюсь разобраться.

проверил IDbuf считает количество записей(строк) в файле, работает исправно)
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
01.06.2010, 14:22     Динамический массив строк. Ввод / вывод #17
Цитата Сообщение от gluck-a Посмотреть сообщение
цикл организован правильно, уверяю Вас, это 100%, у меня функции остальные по тому же принцепу построены и работают)
работать то работают, но зачем первый цикл - там то ничего не меняется - зачем два раза файл считывать?

а вывод "абракадабры" я объяснил - "printf("%s\n",mas)" выводит адрес mas
gluck-a
0 / 0 / 0
Регистрация: 28.05.2010
Сообщений: 23
01.06.2010, 14:26  [ТС]     Динамический массив строк. Ввод / вывод #18
первый раз тупо считает сколько записей(строк), что б создать размер массива.
edd
36 / 36 / 0
Регистрация: 13.05.2010
Сообщений: 81
01.06.2010, 15:40     Динамический массив строк. Ввод / вывод #19
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
int main(){
        ifstream in ("111.txt");
        ofstream out ("222.txt");
       
        string a, temp;
        int k=0;
while (getline (in,a)){
        a+="\n"; 
        if (k) {cout<<temp; out<<temp;}
        temp=a;
        k++;}
 
return 0;}
извините что вмешиваюсь, но к чему столько букв??? если так можно)))

Добавлено через 7 минут
в пред примере удаляло последн а так по номеру

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
int main(){
        ifstream in ("111.txt");
        ofstream out ("222.txt");
       
        string a;
        int k=1, l; cin>>l;
while (getline (in,a)){
        a+="\n"; 
        if (k!=l) {cout<<a; out<<a;}
        k++;}
 
return 0;}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2010, 15:42     Динамический массив строк. Ввод / вывод
Еще ссылки по теме:

Ввод данных в динамический массив из файла C++
C++ Ввод данных в динамический массив из файла
C++ Двумерный динамический массив. Ввод размера с клавиатуры

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

Или воспользуйтесь поиском по форуму:
gluck-a
0 / 0 / 0
Регистрация: 28.05.2010
Сообщений: 23
01.06.2010, 15:42  [ТС]     Динамический массив строк. Ввод / вывод #20
да, спасибо, вариант безусловно хороший) но задание состоит имено работ с 1 файлом что б считать его в память там прокрутить его и вывести в на экран, ну в последствии в тот же файл)
Yandex
Объявления
01.06.2010, 15:42     Динамический массив строк. Ввод / вывод
Ответ Создать тему
Опции темы

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