Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 1
Регистрация: 22.12.2009
Сообщений: 45
1

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

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

Author24 — интернет-сервис помощи студентам
Да, вопрос немного глуповат, но в нете так ничего и не нашла. Либо просто вводила не то для поиска. Не знаю короче.
Суть вопроса: У меня есть символьный массив char s[3000] мне нужен символьный массив, но чтобы он мог считывать текст из любого кол-ва символов. (для задачи с файлами)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.01.2010, 12:56
Ответы с готовыми решениями:

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

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

Извините за глупый вопрос.
Как в С++ записывается "и"? (Например в Pascal это "and"). И как записать это в условие типа: if...

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

16
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
26.01.2010, 12:58 2
std::vector
или
std::string
0
0 / 0 / 1
Регистрация: 22.12.2009
Сообщений: 45
26.01.2010, 13:02  [ТС] 3
zim22, преподаватель сказал что он должен быть тоже на char
0
54 / 50 / 9
Регистрация: 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
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
26.01.2010, 13:11 5
значит динамический массив должен быть
char *arr = new char[256];

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

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


Carpe,а можно как-нибудь поподробнее вообще формулировку всей задачи? Для чего это надо? Может все гараздо проще
0
0 / 0 / 1
Регистрация: 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
54 / 50 / 9
Регистрация: 16.05.2008
Сообщений: 162
26.01.2010, 14:39 13
А почему бы не читать текстовый файл построчно
1
0 / 0 / 1
Регистрация: 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
54 / 50 / 9
Регистрация: 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
0 / 0 / 1
Регистрация: 22.12.2009
Сообщений: 45
26.01.2010, 15:13  [ТС] 16
BornLeader, жаль только я через cin и cout маленько не понимаю с++))
в дюом случае спасибо за помощь, но похоже я еще не безнадежна)
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
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 весь файл, как одна строка с завершающим нулём.
А что в Вашем случае делать - я Вам в другой ветке ответил, хотя и там есть варианты...
1
26.01.2010, 15:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.01.2010, 15:25
Помогаю со студенческими работами здесь

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

Глупый вопрос про наследование
Вот фрагмент кода, реального: class CListviewParamPrimary : public CListviewParamFloats { ...

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru