Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

02.10.2013, 22:21. Просмотров 409. Ответов 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 элемент массива, и не надо ничего извлекать)) и тут то я и вспомнил, что читал об этом не так давно....)

по прежнему интересует как сделать норм работу массива б
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2013, 22:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос проверьте, кажется сам нашёл ошибку уже (C++):

компилятор нашёл ошибку - C++
Ввёл всё как в книге, но компилятор нашёл ошибку. Помогите пжалуйста. И ещё, в спец. теме, пытался понять - как же быть с русскими...

Dev-C++ нашёл ошибку и не компилит( - C++
Здравствуйте. Я пишу всем известную игру Х/О. И я застрял в начале пути из-за того что не могу оприделить ошибку которую мне выдяёт...

задачка (сам уже весь запутался нафиг) - C++
в одномерном массиве состоящим из n вещественных элементов, вычислить: 1) количество элементов меньших С 2) сумму целых частей...

Проверьте пожалуйста код на ошибку - C++
Всем привет , программа при вводе сравнивает является ли слово Палиндромом или нет. Проблема 1)Если я введу например aabcaa то...

Проверьте правильность кода. Почему выдаёт ошибку? - C++
Написать программу, которая считывает текст из файла, находит самое длинное слово и определяет, сколько раз оно встретилось в тексте. ...

проверьте пожалуйста , выбивает ошибку о нехватке памяти - C++
#include &lt;conio.h&gt; #include &lt;iostream.h&gt; #include &lt;string.h&gt; #include &lt;math.h&gt; int X; void Zamena(char B) { switch...

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

вот как сделать так, чтобы хранить все эти строки в массиве, т.е. чтобы скажем массив с[0]="t233" , c[1]="ydsa" и т.д.
или это массив классов писать, не знаю вообщем... сделать так чтобы элеменетом массива была строка...или сделать двойной динамичсеский массив....?
0
alsav22
5426 / 4821 / 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" и т.д.
или это массив классов писать, не знаю вообщем... сделать так чтобы элеменетом массива была строка...или сделать двойной динамичсеский массив....?
Зачем вам всё это, если нужно только количество символов в строке подсчитать?
0
dzrkot
zzzZZZ...
522 / 352 / 53
Регистрация: 11.09.2013
Сообщений: 2,022
02.10.2013, 22:44  [ТС] #5
ну я же для себя делаю, вот мне интересно стало, изначально так и надо было сделать и задача была в этом, просто я решил, что зная длину слова и его номер, можно записать это всё в массив char тупо в 1 строку, а потом по зная длину и номер слова читать из массива то, что надо)
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.10.2013, 22:53 #6
Цитата Сообщение от dzrkot Посмотреть сообщение
ну я же для себя делаю, вот мне интересно стало, изначально так и надо было сделать и задача была в этом, просто я решил, что зная длину слова и его номер, можно записать это всё в массив char тупо в 1 строку, а потом по зная длину и номер слова читать из массива то, что надо)
Задача для меня туманна... Для того, чтобы выводить из массива char строку, не нужно знать её длину. Операторы чтения, при чтении строки в массив char, добавляют в конец терминальный 0, по которому и определяется конец строки (например, при выводе).
Если тут работать с динамическими массивами, то сначала нужно определить количество строк в файле, потом создать динамический массив указателей, размером равный количеству строк в файле, потом читать каждую строку во временный массив, определять её длину, выделять под эту длину, в массиве указателей, память и копировать туда строку.
1
dzrkot
zzzZZZ...
522 / 352 / 53
Регистрация: 11.09.2013
Сообщений: 2,022
02.10.2013, 22:58  [ТС] #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Задача для меня туманна... Для того, чтобы выводить из массива char строку, не нужно знать её длину. Операторы чтения, при чтении строки в массив char, добавляют в конец терминальный 0, по которому и определяется конец строки (например, при выводе).
Если тут работать с динамическими массивами, то сначала нужно определить количество строк в файле, потом создать динамический массив указателей, размером равный количеству строк в файле, потом читать каждую строку во временный массив, определять её длину, выделять под эту длину, в массиве указателей, память и копировать туда строку.
вот именно это я и хочу сделать в этой задаче, прочитать данные из файла и записать их в массив

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

Проверьте программу на ошибку, не могу понять что не так - C++
#include &lt;iostream.h&gt; main() { int a, i, j, t; for(i = 0; i &lt;=10; i++) for(j = 0; i &lt;=10; i++) {if j&lt;=i || j&gt;=(11-i) a=1; ...

Не как не могу найти ошибку уже более часа - C++
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; #define _USE_MATH_DEFINES #define M_PI ...

Проверьте, пожалуйста, код (выдает ошибку "Не удается найти указанный файл") - C++
/////////////////////////////////////////////////////////////////////////////// //В текстовом файле специальные термины выделены ...

Компиляция выдает ошибку "error LNK2005: _main уже определен в int.obj" - C++
Добрый день уважаемые. Столкнулся с данной проблемой. #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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