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

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

Войти
Регистрация
Восстановить пароль
 
 
Carpe
0 / 0 / 0
Регистрация: 22.12.2009
Сообщений: 45
#1

простой и глупый вопрос - C++

26.01.2010, 12:56. Просмотров 798. Ответов 16
Метки нет (Все метки)

Да, вопрос немного глуповат, но в нете так ничего и не нашла. Либо просто вводила не то для поиска. Не знаю короче.
Суть вопроса: У меня есть символьный массив char s[3000] мне нужен символьный массив, но чтобы он мог считывать текст из любого кол-ва символов. (для задачи с файлами)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2010, 12:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос простой и глупый вопрос (C++):

Оч глупый вопрос - C++
вот вместо цифры 1 как поставить переменную p->Bitmap->SaveToFile("C:\\bm\\rf\\1.bmp"); до этого баловался только с борландом.. поэтому...

Глупый вопрос по шаблонам - C++
Доброе время суток! Я достаточно опытный программист Java, но жизнь, как говорится, заставила переквалифицироваться на C++, причем,...

Извините за глупый вопрос. - C++
Как в С++ записывается "и"? (Например в Pascal это "and"). И как записать это в условие типа: if (N<1000) "и" (N>100) { bla bla bla...

Глупый вопрос по указателям? - C++
Здравствуйте! Подскажите как это работает? Правильно ли я понимаю? struct A { }; struct B: public A { int var1; ...

Глупый вопрос про наследование - C++
Вот фрагмент кода, реального: class CListviewParamPrimary : public CListviewParamFloats { private: /** * @brief Возвращает...

Глупый вопрос (возведение в квадрат) - C++
Всем привет. Почему то не работает следующая элементарныя строчка кода. Значения y получаются отрицательными, например около -30000, хотя...

16
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
26.01.2010, 12:58 #2
std::vector
или
std::string
0
Carpe
0 / 0 / 0
Регистрация: 22.12.2009
Сообщений: 45
26.01.2010, 13:02  [ТС] #3
zim22, преподаватель сказал что он должен быть тоже на char
0
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
26.01.2010, 13:11 #4
C++
1
2
3
4
int size = 3000;
char* s = new char[size+1];
.....
delete [] s;
1
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
26.01.2010, 13:11 #5
значит динамический массив должен быть
char *arr = new char[256];

и считывай из файла блоками по 256 байт. и при каждом следующем чтении создавай новый массив, скопировав в него элементы из старого.
1
Carpe
0 / 0 / 0
Регистрация: 22.12.2009
Сообщений: 45
26.01.2010, 13:23  [ТС] #6
сейчас испрбуем)

Добавлено через 9 минут
вот кусок в котором нужно поменять s[3000] на массив типа char только с бесконечным количеством считываемых символов.
либо я вставляю что-то не так, либо еще что-то но программа перестает работать и начинает ошибки выдавать.
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
char s[3000],s1[100]; 
int i=0, k=0;
while (!feof(f))
{
fscanf(f, "%c", &c);
s[i]=c;
 
        if(s[i]!=' ' && s[i]!='\0')
                {
                        s1[k]=s[i];
                        i++;
                        k++;
                }
        else 
        {
            if ((k>=L1 && k<=L2))
                {
                for (int j=0; j<k; j++) 
                    //s1[k]='\0';                   
                    //printf("\n%s",s1);
        fprintf(g, "%c", s1[j]);
        fprintf(g, " ");
        //s[i]=='\0';
                        }   
            //else 
                k=0;
    if(s[i]=='\0') break;
                    i++;
        }
}
0
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
26.01.2010, 13:23 #7
Цитата Сообщение от zim22 Посмотреть сообщение
значит динамический массив должен быть
char *arr = new char[256];

и считывай из файла блоками по 256 байт. и при каждом следующем чтении создавай новый массив, скопировав в него элементы из старого.
вообще то перераспределение памяти на каждой итерации это будет довольно таки ресурсоемко, уж проще будет один раз тупо пробежаться по файлу по байтно прочитав узнать его настоящую длину и просто один раз выделить всю необходимую память
0
Carpe
0 / 0 / 0
Регистрация: 22.12.2009
Сообщений: 45
26.01.2010, 13:27  [ТС] #8
Цитата Сообщение от BornLeader Посмотреть сообщение
вообще то перераспределение памяти на каждой итерации это будет довольно таки ресурсоемко, уж проще будет один раз тупо пробежаться по файлу по байтно прочитав узнать его настоящую длину и просто один раз выделить всю необходимую память
а вот это как сделать на примере моего куска?
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
26.01.2010, 13:47 #9
Цитата Сообщение от BornLeader Посмотреть сообщение
уж проще будет один раз тупо пробежаться по файлу по байтно прочитав узнать его настоящую длину и просто один раз выделить всю необходимую память
я вообще не понимаю, зачем в памяти хранить весь файл сразу. и если уж пошла такая пьянка, то лучше замапить файл в память.
0
Carpe
0 / 0 / 0
Регистрация: 22.12.2009
Сообщений: 45
26.01.2010, 13:56  [ТС] #10
zim22, поговорили и ушли и помощи леди не дождолась...
0
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
26.01.2010, 14:18 #11
Цитата Сообщение от zim22 Посмотреть сообщение
я вообще не понимаю, зачем в памяти хранить весь файл сразу.
Я тоже этого не понимаю. Зачем?


Carpe,а можно как-нибудь поподробнее вообще формулировку всей задачи? Для чего это надо? Может все гараздо проще
0
Carpe
0 / 0 / 0
Регистрация: 22.12.2009
Сообщений: 45
26.01.2010, 14:28  [ТС] #12
Ну. вообщем сама задача:
Дан текстовый файл F. Переписать в другой файл G все слова, длина которых составляет от L1 до L2 символов.
Работающий код.
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
48
49
50
51
52
53
54
55
56
57
#include <stdio.h> //ввод вывод данных 
#include <conio.h> //для _getch ожидание
#include <string.h> // ввод строк
#include <locale.h> //для установки русской раскладки
 
int main()
{
        FILE *f, *g;
        setlocale(LC_ALL, "Russian");
               
        
        int L1, L2;
        char c;
        f = fopen("F.txt","r");
        g = fopen("G.txt","w");
        printf("Введите L1 и L2 для того, чтобы программа смогла найти\nслова и переписать их в файл F.\n");
printf("Length L1= "); scanf("%d", &L1); printf("Length L2= "); scanf("%d", &L2); 
printf("\n\n\n");
char s[3000],s1[100]; 
int i=0, k=0;
while (!feof(f))
{
fscanf(f, "%c", &c);
s[i]=c;
//if (c==' ' || c=='\n' || c=='\t');
 
        if(s[i]!=' ' && s[i]!='\0')
                {
                        s1[k]=s[i];
                        i++;
                        k++;
                }
        else 
        {
            if ((k>=L1 && k<=L2))
                {
                for (int j=0; j<k; j++) 
                    //s1[k]='\0';                   
                    //printf("\n%s",s1);
        fprintf(g, "%c", s1[j]);
        fprintf(g, " ");
        //s[i]=='\0';
                        }   
            //else 
                k=0;
    if(s[i]=='\0') break;
                    i++;
        }
}
//s1[k]='\0';
 //printf("\n%s",s1);
//if (c!=' ' && c!='\n' && c!='\t')i=i+1;
        printf("\nПрограмма успешно выполнена!");
        fclose(f); 
        fclose(g);
getch();
}
Мне нужно, чтобы первый символьный массив был не из 3 тысяч символов, а из неопределенного числа. Чтобы программа могла считывать любой текстовый документ. Соответственно, если мы заменяем массив s[3000] то по неведомым мне причинам получается так, что в цикле подсчета символов, символы считаться не хотят. ну а значит программа полностью не выполняется.
Как еще проще я уже не знаю...
0
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
26.01.2010, 14:39 #13
А почему бы не читать текстовый файл построчно
1
Carpe
0 / 0 / 0
Регистрация: 22.12.2009
Сообщений: 45
26.01.2010, 14:53  [ТС] #14
BornLeader, а зачем?
чем плох такой метод?
просто мне сказали считывать азноразмерные документы, вот теперь не знаю что делать.
может быть есть какой то справочный материал по char и его использованию, хотелось бы почитать)

Добавлено через 9 минут
BornLeader, спасибо))
не знаю за что просто так))
как то с умными людьми сама становишься умнее)) вообщем я все сделала)
ГОТОВАЯ:
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
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h> //ввод вывод данных 
#include <conio.h> //для _getch ожидание
#include <string.h> // ввод строк
#include <locale.h> //для установки русской раскладки
 
int main()
{
        FILE *f, *g;
        setlocale(LC_ALL, "Russian");
           //printf("Текст задачи:\n");
        //printf("Дан текстовый файл F. Переписать в другой файл G все слова,\nдлина которых составляет от L1 до L2 символов.\n\n\n");
        
        
        int L1, L2;
        char c;
        f = fopen("F.txt","r");
        g = fopen("G.txt","w");
        printf("Введите L1 и L2 для того, чтобы программа смогла найти\nслова и переписать их в файл F.\n");
printf("Length L1= "); scanf("%d", &L1); printf("Length L2= "); scanf("%d", &L2); 
printf("\n\n\n");
 
char s1[100]; 
int i=0, k=0;
while (!feof(f))
{
fscanf(f, "%c", &c);
//s[i]=c;
//if (c==' ' || c=='\n' || c=='\t');
 
        if(c!=' ' && c!='\0' && c!='\t')
                {
                        s1[k]=c;
                        i++;
                        k++;
                }
        else 
        {
            if ((k>=L1 && k<=L2))
                {
                for (int j=0; j<k; j++) 
                    //s1[k]='\0';                   
                    //printf("\n%s",s1);
        fprintf(g, "%c", s1[j]);
        fprintf(g, " ");
        //s[i]=='\0';
                        }   
            //else 
                k=0;
    if(c=='\0') break;
                    i++;
        }
}
//s1[k]='\0';
 //printf("\n%s",s1);
//if (c!=' ' && c!='\n' && c!='\t')i=i+1;
        printf("\nПрограмма успешно выполнена!");
        fclose(f); 
        fclose(g);
getch();
}
все работает как надо) правда немного через китай
можно как то сделать отрезок от l1 до l2 по другому, но в итоге как сделано тоже работает)
0
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
26.01.2010, 15:08 #15
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
#include <iostream>
#include <fstream>
#include <string> // ввод строк
#include <locale.h> //для установки русской раскладки
using namespace std;
 
bool IsValid(char* p,size_t lenght1,size_t lenght2)
{
  return (((strlen(p)>lenght1)&&(strlen(p)<lenght2))?true:false);
}
 
int main()
{
  setlocale(LC_ALL, "Russian");
  ifstream ifile("F.txt");
  ofstream ofile("G.txt");
  int L1, L2;
  cout << "Введите L1 и L2 для того, чтобы программа смогла найти\nслова и переписать их в файл F.\nLength L1= ";
  cin >> L1;
  cout << "Length L2= ";
  cin >> L2;
  
  string str;
  while(getline(ifile,str))
  {
    char* p;
    p = strtok(const_cast<char*>(str.c_str()), " ");
    if(p)
      if(IsValid(p,L1,L2))
        ofile << p << " ";
    while(p = strtok(NULL, " "))
    {
      if(IsValid(p,L1,L2))
        ofile << p << " ";
    }
  }        
 
  cout << "\nПрограмма успешно выполнена!" << endl;
  ifile.close();
  ofile.close();
  return 0;
}
1
26.01.2010, 15:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2010, 15:08
Привет! Вот еще темы с ответами:

Стек, связный список и глупый вопрос - C++
Содержание stack.h #include &lt;cstddef&gt; // Определение константы NULL template &lt;typename T&gt; class Stack { public: Stack(); ...

Глупый вопрос по типу данных Variant - C++
Обнаружил, что не очень четко понимаю что он из себя представляет и при его использовании возникает пачка вопросов. Может быть...

Глупый вопрос по считыванию символов с клавиатуры - C++
заранее извиняюсь за глупый вопрос, но ответ на него отгуглить не смог: n = getche не считывает нажатия на enter, но считывает пробелы...

Простой вопрос - C++
Ребят вопросик не сложный. К примеру, у меня есть два числа (int a=32, b=45) Как сделать чтобы в переменную z записалось 3245....


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

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

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