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

размер считываемой строки из файла - C++

Восстановить пароль Регистрация
 
 
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
18.10.2013, 14:18     размер считываемой строки из файла #1
открываю файл, пытаюсь считать строку в массив, массив через char* a=new char[n], есть ли функция, которая мне вернёт размер строки из файла? Или придётся 2 раза считывать файл, 1ый раз в какой-нибудь буфер, считая символы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int n;
ifstream file;
file.open("text.txt");
n = //??
char* strArray=new char[n];
 
//дальше мой кодъ!
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2013, 14:27     размер считываемой строки из файла #2
Цитата Сообщение от dzrkot Посмотреть сообщение
есть ли функция, которая мне вернёт размер строки из файла?
Без чтения строки? Если только, при записи строки в файл, сначала записывать её размер.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5436 / 2560 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
18.10.2013, 14:29     размер считываемой строки из файла #3
Наверное сперва надо считать getline-ом строку и узнать ее размер. Без чтения наверное никак.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2013, 14:29     размер считываемой строки из файла #4
Цитата Сообщение от dzrkot Посмотреть сообщение
Или придётся 2 раза считывать файл, 1ый раз в какой-нибудь буфер, считая символы
Не обязатльно файл, но строку прийдётся.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
18.10.2013, 14:29  [ТС]     размер считываемой строки из файла #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Без чтения строки? Если только, при записи строки в файл, сначала записывать её размер.
понятно, значит 2 раза читать
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2013, 14:30     размер считываемой строки из файла #6
С размером файла проще, тут не нужно читать весь файл, через seekg() и tellg() можно узнать.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
18.10.2013, 14:30     размер считываемой строки из файла #7
Цитата Сообщение от dzrkot Посмотреть сообщение
значит 2 раза читать
либо один раз, по символу или по нескольку символов, переодически перевыделяя память...
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
18.10.2013, 14:41     размер считываемой строки из файла #8
Если хотите работать с char* и в файле более одной строки! то можно написать вариант "для лаб": создать достаточно большой массив, считать в него, узнать длину строки в нем, скопировать в требуемый. Либо считывать два раза.

А вообще std::string и не надо извращаться.

Цитата Сообщение от Croessmah Посмотреть сообщение
либо один раз, по символу или по нескольку символов, переодически перевыделяя память...
представляю как этот монстр будет насиловать ОС

Если что, считывание строки - std::getline.
dzrkot, советую проверять наличие открытого файла
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
18.10.2013, 14:46     размер считываемой строки из файла #9
Цитата Сообщение от MrGluck Посмотреть сообщение
представляю как этот монстр будет насиловать ОС
смотря как сделать
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
18.10.2013, 14:49     размер считываемой строки из файла #10
Croessmah, постоянное перераспределение памяти это как туда-сюда, туда-сюда ....
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
18.10.2013, 14:55  [ТС]     размер считываемой строки из файла #11
Цитата Сообщение от MrGluck Посмотреть сообщение
Если хотите работать с char* и в файле более одной строки! то можно написать вариант "для лаб": создать достаточно большой массив, считать в него, узнать длину строки в нем, скопировать в требуемый. Либо считывать два раза.
Если что, считывание строки - std::getline.
dzrkot, советую проверять наличие открытого файла
ну первоначально я и сделал новый массив, file.getline(strArray,n,'\0');
но так ведь придётся потом перебирать массив до '\n', считая символы, потом выделять под строку другой массив.

Я делал через string уже такую прогу(я её ток потерял где-то на компе), и там в двумерном массиве хранил эти строки, и тогда 2 раза читал файл.
Просто стал делать для char, и выяснилось что он пропускает пробелы и '\n', и вот я что-то залип на этом месте и как посчитать длинну строки не понимаю)))
C++
1
2
3
4
5
while(!file.eof())
{
file>> arrayStr[i];
i++;
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
18.10.2013, 15:00     размер считываемой строки из файла #12
Цитата Сообщение от dzrkot Посмотреть сообщение
file.getline(strArray,n,'\0');
зачем вам третий параметр? Используйте перегруженную версию с двумя параметрами и со взятием строки до '\n'

Добавлено через 1 минуту
Пример работы с массивом строк на С. Считывание идет также до '\n' но со стандартного потока, поменять легко.
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
61
62
63
64
65
66
67
68
/*Напечатать те слова, которые отличаются только порядком следования букв. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int compare (const void *, const void *);
int equalChars(char **, const size_t, const char *);
    
int main(void)
{
    char str[256], **words = NULL, **sortWords = NULL, *p = NULL;
    size_t i, len, numWords = 1;
    if (fgets(str, sizeof(str), stdin) == NULL || strlen(str) == 1)
        return 1;
    len = strlen(str);
    str[len - 1] = '\0';
    for (i=0; i < len; i++)
        if (str[i] == ' ')
            numWords++;
    if ((words     = (char **)malloc (sizeof(char *) * numWords)) == NULL ||
        (sortWords = (char **)malloc (sizeof(char *) * numWords)) == NULL)
        return 2;
    i = 0;
    for (p = strtok(str, " "); p != NULL; p = strtok(NULL, " "))
    {
        if ((words[i]     = strdup(p)) == NULL || 
            (sortWords[i] = strdup(p)) == NULL)
            return 3;
        qsort(sortWords[i], strlen(sortWords[i]), sizeof(char), compare);
        i++;
    }
    
    for (i = 0; i < numWords; i++)
        if (equalChars(sortWords, numWords, words[i]))
            printf("%s\n", words[i]);
    
    for (i = 0; i < numWords; i++)
    {
        free(words[i]);
        free(sortWords[i]);
    }
    free(words);
    free(sortWords);
    free(p);
    return 0;
}
 
int compare (const void *a, const void *b)
{
    return *(char *)a - *(char *)b;
}
 
int equalChars(char **words, const size_t num, const char *word)
{
    size_t i, j;
    char *tmp = strdup(word);
    qsort(tmp, strlen(tmp), sizeof(char), compare);
    for (i=0; i < num-1; i++)
        if (strcmp(words[i], tmp) == 0)
            for (j=i+1; j < num; j++)
                if (strcmp(words[j], tmp) == 0)
                {
                    free(tmp);
                    return 1;
                }
    free(tmp);
    return 0;
}
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
18.10.2013, 15:01  [ТС]     размер считываемой строки из файла #13
Цитата Сообщение от MrGluck Посмотреть сообщение
зачем вам третий параметр? Используйте перегруженную версию с двумя параметрами и со взятием строки до '\n'
не очень понел...
там на самом деле file.getline(strArray,n,'\n'); я так понимаю что он переписывает до первого '\n'
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2013, 15:26     размер считываемой строки из файла #14
Цитата Сообщение от dzrkot Посмотреть сообщение
там на самом деле file.getline(strArray,n,'\n');
Там, по-умолчанию, третий параметр '\n', поэтому писать его не обязательно.

Добавлено через 2 минуты
dzrkot, у вас задача, вообще, какая? И через что её можно делать? Есть ограничения?
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
18.10.2013, 15:48  [ТС]     размер считываемой строки из файла #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Там, по-умолчанию, третий параметр '\n', поэтому писать его не обязательно.

Добавлено через 2 минуты
dzrkot, у вас задача, вообще, какая? И через что её можно делать? Есть ограничения?
в массив массивов char'ов записать из файла.txt строки, до '\n', после чего из выбранных строк у всех слов удалить первый символ
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
19.10.2013, 00:24     размер считываемой строки из файла #16
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
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <fstream>
#include <cstring>
 
// функция удаляет первые буквы у каждого слова в строке
void delFirstChars(char *str)
{
    // выделяем память под временный массив
    char* tmp = new char[strlen(str) + 1];
    // индекс сдвига по результирующему массиву
    unsigned int index = 0;
    // копируем во временный массив строки без первых букв слов
    for (int i=1; i < strlen(str); i++)
    {
        // если предыдущий символ - пробел и текущий им не является, пропускаем
        if (str[i-1] == ' ' && str[i] != ' ')
            continue;
        // иначе записываем новую букву в строку
        tmp[index++] = str[i];
    }
 
    strcpy(str, tmp);  // копируем полученный временный массив в исходный
    str[index] = '\0'; // устанавливаем конец строки
    // освобождаем память
    delete[] tmp;
}
 
 
int main()
{
    std::ifstream ifs("input.txt");
    if (!ifs) return 1;
    char** words = nullptr;  // массив строк
    const int size = 256;    // длина вспомогательного массива
    char tmp[size];          // вспомогательный массив
    int counter = 0;         // счетчик количества строк
 
    // узнаем количество строк
    while (ifs.getline(tmp, sizeof(tmp)))
        counter++;
    // выделяем память под строки
    words = new char*[counter];
 
    // сбрасываем флаг ошибок (EOF) и устанавливаем считывание в начало файла
    ifs.clear();
    ifs.seekg(0);
 
    for (int i=0; i < counter && !ifs.eof(); i++)
    {
        // считываем во временный массив
        ifs.getline(tmp, sizeof(tmp));
        // выделяем память под массив символов, равный длине временного + 1
        words[i] = new char[strlen(tmp) + 1];
        // копируем значение из временного массива в текущую строку
        strcpy(words[i], tmp);
        // выводим строку на экран
        std::cout << words[i] << std::endl;
        // удаляем первые буквы у слов
        delFirstChars(words[i]);
    }
 
    std::cout << "\nAfter deleting first character in each word:\n";
    // выводим результат на экран и освобождаем память
    for (int i=0; i < counter; i++)
    {
        std::cout << words[i] << std::endl;
        delete[] words[i];
    }
    delete[] words;
}
С std::string, а также с std::istringstream выглядело бы намного проще, но он может пробелы зажевать.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
19.10.2013, 01:01  [ТС]     размер считываемой строки из файла #17
спасибо, я попробую разобраться в вашем коде попозже, я вот свой накатал, но там в конце неувязка

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
const int n=200;//размер буфера
int c; // счетчик для кол-ва символов в строке
int i=0; // счетчик кол-ва строк
 
ifstream file; // создаем объект  file
file.open("text.txt"); // привязываем file к имени файла и открываем
while(!file.eof()) // цикл для чтения из файла до его конца, считаем кол-во строк
{
char* a=new char[n]; // создаем буфер для считывания в него файла
file.getline(a,n);   // считываем туда строку до символа '\0' по умолчанию
delete []a;         // очищаем буфер
i++;                //увеличиваем счётчик кол-ва строк
}
file.close();       // закрываем файл, т.к. прочитать его снова с 1ой строки иначе я не знаю как
file.open("text.txt");  //открываем его снова
char** b=new char*[i];  // массив для хранения массивов со строками
i=0;                    // обнуляем счётчик для заполнения массива b
while(!file.eof())          // цыкл цыкл мотоцикл:D
{
c=0;                   // счётчик для подсчёта символов
char* a=new char[n];  // буфер
file.getline(a,n);      // снова читаем в буфер файл
    while (a[c]!='\0')  //подсчитываем символы до конца строки
    {
    c++;            //итерация
    }
cout<<"\nc="<<c<<"  "; //просто контролируем результат
char* d=new char[c+1];  //выделяем память под массив хранящий символы
d[c+1]='\0';        // записываем конец строки
    for (int j=0;j<=c;j++)   // в цикле посимвольно записываем в наш массив буфер а[]
    {
    d[j]=a[j];
    cout<<d[j];     // контролим что получилось
    }
b[i]=&d[0];       // присваиваем главному массиву адреса массивов с символами
cout<<"i="<<i<<endl;    // контролим кол-во строк
delete []a;     // чистим буфер
i++;          // итерация строки
}
cout<<"\n"<<endl;
 
 
int k;
for (int j=0;j<=i;j++) // выводи главный массив со стркоами
    {
    k=0;
 
// и вот начиная с этого цикла у меня пошёл треш в голове
//...я не понимаю почему в while надо обращатсья к массиву без разыменовывания, т.е. *
// ,а в if уже обязательно через *, иначе цикл не находит \eof, если подставить в while \eof
// то компилятор не компилит, + ко всему к этому пробелы в ифе он тоже не видит
// вообщем я не понимаю... если обращаюсь к массиву через cout<<(b[j]+k) б ,без *, то получаю на экране строку, а не адерс этой строки
// если обращаюсб через * то получаю уже символ... почему if while так непонятно работают...
// вообщем где-то косяк, но я не понимаю где, т.к.  не очень представляю char **b=new char*[];
// это как указатель на указатель 1ого элемента массива, в котором хранятся указатели на 1ый элемент других массивов...
        while ((b[j]+k)!='\0')
        {
        cout<<(b[j]+k)<<"   ";
        *(b[j])=' ';
        if (*(b[j]+k)==' ') // пробелы игнорируются
            *(b[j]+k)=' ';
        if ((*b[j]+k)!='\eof')
        break;
        k++;
        }
 
    }
 
cout<<endl;
for (int j=0;j<=i;j++)
cout<<(b[j])<<endl;
delete [] b;            // чистим его, хотя он итак удалится
file.close();       // закрываем файл
return 0;
}
вспомнил, что вроде массив char'ов в cout выводится весь, если обратиться к его 1ому элементу...хотя мб ошибаюсь
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.10.2013, 01:08     размер считываемой строки из файла #18
Цитата Сообщение от dzrkot Посмотреть сообщение
file.getline(a,n); // считываем туда строку до символа '\0' по умолчанию
До '\n'.
Цитата Сообщение от dzrkot Посмотреть сообщение
file.close(); // закрываем файл, т.к. прочитать его снова с 1ой строки иначе я не знаю как
C++
1
2
file.clear();
file.seekg(0);
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
19.10.2013, 01:10     размер считываемой строки из файла #19
Цитата Сообщение от dzrkot Посмотреть сообщение
что вроде массив char'ов в cout выводится весь, если обратиться к его 1ому элементу
смотря как обратиться. Если через указатель, то да. Если по индексу, то выведет элемент массива - букву.

Вам бы отступов расставить, я бы помог. Также советовал бы комментировать лишь то, о чем не может сказать код. Количество лишнего текста мозолит глаза.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2013, 01:24     размер считываемой строки из файла
Еще ссылки по теме:

Размер строки C++
C++ Получить третий файл, содержащий чётные строки первого файла и нечётные строки второго файла
Размер файла C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.10.2013, 01:24     размер считываемой строки из файла #20
Цитата Сообщение от dzrkot Посмотреть сообщение
file.getline(a,n); // считываем туда строку до символа '\0' по умолчанию
В файле, в конце строк нет '\0'. При записи в файл (строчными методами), терминальный ноль не записывается.
Yandex
Объявления
19.10.2013, 01:24     размер считываемой строки из файла
Ответ Создать тему
Опции темы

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