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

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

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

Глупый вопрос по считыванию символов с клавиатуры C++
Глупый вопрос по указателям? C++
C++ Оч глупый вопрос
C++ Глупый вопрос (возведение в квадрат)
Глупый вопрос по шаблонам C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
26.01.2010, 12:58     простой и глупый вопрос #2
std::vector
или
std::string
Carpe
 Аватар для Carpe
0 / 0 / 0
Регистрация: 22.12.2009
Сообщений: 45
26.01.2010, 13:02  [ТС]     простой и глупый вопрос #3
zim22, преподаватель сказал что он должен быть тоже на char
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;
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
26.01.2010, 13:11     простой и глупый вопрос #5
значит динамический массив должен быть
char *arr = new char[256];

и считывай из файла блоками по 256 байт. и при каждом следующем чтении создавай новый массив, скопировав в него элементы из старого.
Carpe
 Аватар для 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++;
        }
}
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
26.01.2010, 13:23     простой и глупый вопрос #7
Цитата Сообщение от zim22 Посмотреть сообщение
значит динамический массив должен быть
char *arr = new char[256];

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


Carpe,а можно как-нибудь поподробнее вообще формулировку всей задачи? Для чего это надо? Может все гараздо проще
Carpe
 Аватар для 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] то по неведомым мне причинам получается так, что в цикле подсчета символов, символы считаться не хотят. ну а значит программа полностью не выполняется.
Как еще проще я уже не знаю...
BornLeader
50 / 46 / 1
Регистрация: 16.05.2008
Сообщений: 162
26.01.2010, 14:39     простой и глупый вопрос #13
А почему бы не читать текстовый файл построчно
Carpe
 Аватар для 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 по другому, но в итоге как сделано тоже работает)
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;
}
Carpe
 Аватар для Carpe
0 / 0 / 0
Регистрация: 22.12.2009
Сообщений: 45
26.01.2010, 15:13  [ТС]     простой и глупый вопрос #16
BornLeader, жаль только я через cin и cout маленько не понимаю с++))
в дюом случае спасибо за помощь, но похоже я еще не безнадежна)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2010, 15:25     простой и глупый вопрос
Еще ссылки по теме:

C++ Глупый вопрос про наследование
Извините за глупый вопрос. C++
Глупый вопрос по типу данных Variant C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
26.01.2010, 15:25     простой и глупый вопрос #17
Carpe, узнать линну файла и выделить память под такой же буфер можно примерно так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
...
FILE *f;
long len;
char *buf;
if ( ( f = fopen(file_name, "rb") ) == NULL )
  exit(1);
fseek(f, 0, SEEK_END);
len = ftell(f);
rewind(f);
if ( ( buf = (char*)malloc(len + 1) ) == NULL )
  exit(1);
if ( fread(buf, 1, len, f) != len )
  exit(1);
buf[len] = 0;
fclose(f);
...
в результате в buf весь файл, как одна строка с завершающим нулём.
А что в Вашем случае делать - я Вам в другой ветке ответил, хотя и там есть варианты...
Yandex
Объявления
26.01.2010, 15:25     простой и глупый вопрос
Ответ Создать тему
Опции темы

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