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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
#1

проверьте, кажется сам нашёл ошибку уже - C++

02.10.2013, 22:21. Просмотров 395. Ответов 12
Метки нет (Все метки)

Вообщем захотел сделать задачку, чтение из файла символов произвольной длинны и поиск их кол-ва символов. Создаю 2 массива, Под длину массив a, под символы - массив b, начинаю считывать, всё правильно в цикле, а вот когда пытаюсь после цикла вывести массив а, то он почему-то обращается по другим адресам, т.е. а[0] в цикле не своответствует а[0] вне цикла, в чём фишка.
Ну и заодно хотелось бы узнать как записать все символы в массив, это получается мне надо делать массив указателей на др массивы? и потом записывать через указатели всё туда?
Плз подскажите, я же сегодня не усну спокойно))


я походу понял пока писал комментарии, в чём фишка, но прошу проверить вас, там написано напротив a=new [count+1]

файл имеет вид:
t233
ydsa
ud
aaaaa
wwwww


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
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
int main()
{
ifstream somefile("xxx.txt"); // открываю для чтения
 
int size=sizeof(char);
int count=0;
char *b; // динамич массив для строки символов
int *a;   // динамич массив для длины
int i=0; // счётчик для массива а, соответственно длина 1ого слова пишется в a[0]
int s;  // просто для ограничения for после while
 
while (!somefile.eof())
{
b = new char[size]; //выделяем память под 1 символ
somefile>>b; //сам поток
 
a = new int[++count]; //хм...count+1 выделит память под под 2 элемента типа инт в другой произвольной области(перепутал с арифметикой указателей...), а я думал что последовательно...походу вот что происходит.
 
 
size = strlen(b); //ищем длину слова
a[i]=size;          //сохраняем в массив
 
cout<<"a["<<i<< "] = "<<a[i]<<endl;
cout<<"adress : "<<&a[i]<<endl;
i++;
s=i;
}
cout<<"\n\nwhile off"<<endl;
for (int i=0;i<s;i++)
{
cout<<"a["<<i<< "] = "<<a[i]<<endl;
cout<<"adress : "<<&a[i]<<endl;
}
    delete []a;
    delete []b;
    return 0;
}
Добавлено через 5 минут
да, я прав, но как теперь исправить прогу чтобы получить длину массива а, который я создаю (до цикла надо создавать) )...

Добавлено через 35 минут
хм...вынес a = new int[0]; за цикл, и о чудо, запись в массив пошла как надо по памяти, при том что объявлен только 1 элемент массива, и не надо ничего извлекать)) и тут то я и вспомнил, что читал об этом не так давно....)

по прежнему интересует как сделать норм работу массива б
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.10.2013, 22:28     проверьте, кажется сам нашёл ошибку уже #2
Цитата Сообщение от dzrkot Посмотреть сообщение
b = new char[size]; //выделяем память под 1 символ
somefile>>b; //сам поток
Память под один символ, а читаете туда несколько? somefile>> будет читать до первого пробельного символа, в данном случае, до символа новой строки.
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
02.10.2013, 22:36  [ТС]     проверьте, кажется сам нашёл ошибку уже #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Память под один символ, а читаете туда несколько? somefile>> будет читать до первого пробельного символа, в данном случае, до символа новой строки.
да это я знаю, оно и читает всю строку, по идее туда что угодно можно записать, но понял я это уже в процессе написания задачи...

вот как сделать так, чтобы хранить все эти строки в массиве, т.е. чтобы скажем массив с[0]="t233" , c[1]="ydsa" и т.д.
или это массив классов писать, не знаю вообщем... сделать так чтобы элеменетом массива была строка...или сделать двойной динамичсеский массив....?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.10.2013, 22:41     проверьте, кажется сам нашёл ошибку уже #4
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
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
 
int main()
{
    ifstream somefile("xxx.txt"); 
 
    int count=0;
    string b;
    vector <int> a;
 
    while (getline(somefile, b))
    {
       a.push_back(b.size());
    }
    somefile.close();
 
    for (int i = 0; i < a.size();i++)
    {
        cout << a[i] << endl;
    }
    
    return 0;
}
Добавлено через 2 минуты
Цитата Сообщение от dzrkot Посмотреть сообщение
вот как сделать так, чтобы хранить все эти строки в массиве, т.е. чтобы скажем массив с[0]="t233" , c[1]="ydsa" и т.д.
или это массив классов писать, не знаю вообщем... сделать так чтобы элеменетом массива была строка...или сделать двойной динамичсеский массив....?
Зачем вам всё это, если нужно только количество символов в строке подсчитать?
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
02.10.2013, 22:44  [ТС]     проверьте, кажется сам нашёл ошибку уже #5
ну я же для себя делаю, вот мне интересно стало, изначально так и надо было сделать и задача была в этом, просто я решил, что зная длину слова и его номер, можно записать это всё в массив char тупо в 1 строку, а потом по зная длину и номер слова читать из массива то, что надо)
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.10.2013, 22:53     проверьте, кажется сам нашёл ошибку уже #6
Цитата Сообщение от dzrkot Посмотреть сообщение
ну я же для себя делаю, вот мне интересно стало, изначально так и надо было сделать и задача была в этом, просто я решил, что зная длину слова и его номер, можно записать это всё в массив char тупо в 1 строку, а потом по зная длину и номер слова читать из массива то, что надо)
Задача для меня туманна... Для того, чтобы выводить из массива char строку, не нужно знать её длину. Операторы чтения, при чтении строки в массив char, добавляют в конец терминальный 0, по которому и определяется конец строки (например, при выводе).
Если тут работать с динамическими массивами, то сначала нужно определить количество строк в файле, потом создать динамический массив указателей, размером равный количеству строк в файле, потом читать каждую строку во временный массив, определять её длину, выделять под эту длину, в массиве указателей, память и копировать туда строку.
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
02.10.2013, 22:58  [ТС]     проверьте, кажется сам нашёл ошибку уже #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Задача для меня туманна... Для того, чтобы выводить из массива char строку, не нужно знать её длину. Операторы чтения, при чтении строки в массив char, добавляют в конец терминальный 0, по которому и определяется конец строки (например, при выводе).
Если тут работать с динамическими массивами, то сначала нужно определить количество строк в файле, потом создать динамический массив указателей, размером равный количеству строк в файле, потом читать каждую строку во временный массив, определять её длину, выделять под эту длину, в массиве указателей, память и копировать туда строку.
вот именно это я и хочу сделать в этой задаче, прочитать данные из файла и записать их в массив

просто в дальнейшем я буду писать прогу для обработки данных с СОМ порта, и там примерно это и надо будет делать, только данные будут не char, а int. А такие вот задачки это как раз для того, чтобы лучше понимать что делать и как.
Ещё раз спасибо
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.10.2013, 23:00     проверьте, кажется сам нашёл ошибку уже #8
А string и vector разве запрещено использовать
Цитата Сообщение от dzrkot Посмотреть сообщение
для обработки данных с СОМ порта
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
02.10.2013, 23:07  [ТС]     проверьте, кажется сам нашёл ошибку уже #9
Цитата Сообщение от alsav22 Посмотреть сообщение
А string и vector разве запрещено использовать
с вектором я почти не знаком, а стринг - строковая фишка насколько я знаю. Так будет функциональнее и опыта побольше, как мне кажется, но над вектором посижу.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.10.2013, 23:45     проверьте, кажется сам нашёл ошибку уже #10
Цитата Сообщение от dzrkot Посмотреть сообщение
а стринг - строковая фишка насколько я знаю.
И что из этого следует?
Цитата Сообщение от dzrkot Посмотреть сообщение
Так будет функциональнее
А конкретнее?
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
03.10.2013, 18:43  [ТС]     проверьте, кажется сам нашёл ошибку уже #11
Цитата Сообщение от alsav22 Посмотреть сообщение
И что из этого следует?
то, что я по идее она работает только с символами, и я не смогу из неё получить чистые данные типа int , мб я не прав
Цитата Сообщение от alsav22 Посмотреть сообщение
А конкретнее?
Ну мб я не прав..
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.10.2013, 18:50     проверьте, кажется сам нашёл ошибку уже #12
Цитата Сообщение от dzrkot Посмотреть сообщение
то, что я по идее она работает только с символами, и я не смогу из неё получить чистые данные типа int ,
Что за чистые данные типа int? Длина строки? Объект string знает длину строки (количество символов в строке), с которой связан. Если str - это string, то этот метод выдаст количество символов в строке:
C++
1
str.size();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2013, 23:35     проверьте, кажется сам нашёл ошибку уже
Еще ссылки по теме:
Не как не могу найти ошибку уже более часа C++
C++ Проверьте, пожалуйста, код (выдает ошибку "Не удается найти указанный файл")
Компиляция выдает ошибку "error LNK2005: _main уже определен в int.obj" C++
C++ Текстовой файл с уже введенным текстом зашифровать и вывести уже зашифрованный

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

Или воспользуйтесь поиском по форуму:
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
03.10.2013, 23:35  [ТС]     проверьте, кажется сам нашёл ошибку уже #13
Цитата Сообщение от alsav22 Посмотреть сообщение
Что за чистые данные типа int? Длина строки? Объект string знает длину строки (количество символов в строке), с которой связан. Если str - это string, то этот метод выдаст количество символов в строке:
C++
1
str.size();
нет, у меня на практике будут идти данные с ацп через микроконтроллер по rs232 в комп, и там обрабатываться, в какоми виде я пока не знаю но по идее там 1 число в 1 строку пишется, как я помню
Yandex
Объявления
03.10.2013, 23:35     проверьте, кажется сам нашёл ошибку уже
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru