Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041

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

18.10.2013, 14:18. Показов 6799. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
открываю файл, пытаюсь считать строку в массив, массив через 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;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.10.2013, 14:18
Ответы с готовыми решениями:

Формат строки(размер файла)
Здравствуйте! Имеется такой код TextBox1.Text = &quot;Скачивание обновлений. Загружено байт: &quot; + e.BytesReceived / 1000; Как...

Получить имя файла и размер файлов в архиве из строки
Доброго времени суток помогите пожалуйста разобраться. Мне необходимо с помощью 7zip работать с архивами, а именно получить имя файла и...

Вычислить суммарный размер файлов в килобайтах и средний размер файла
Нужно составить программу с помощью которой с клавиатуры вводятся размер 6 файлов в байтах(от 100 до 2000) и вычисляет суммарный размер...

20
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2013, 14:27
Цитата Сообщение от dzrkot Посмотреть сообщение
есть ли функция, которая мне вернёт размер строки из файла?
Без чтения строки? Если только, при записи строки в файл, сначала записывать её размер.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
18.10.2013, 14:29
Наверное сперва надо считать getline-ом строку и узнать ее размер. Без чтения наверное никак.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2013, 14:29
Цитата Сообщение от dzrkot Посмотреть сообщение
Или придётся 2 раза считывать файл, 1ый раз в какой-нибудь буфер, считая символы
Не обязатльно файл, но строку прийдётся.
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
18.10.2013, 14:29  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Без чтения строки? Если только, при записи строки в файл, сначала записывать её размер.
понятно, значит 2 раза читать
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2013, 14:30
С размером файла проще, тут не нужно читать весь файл, через seekg() и tellg() можно узнать.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
18.10.2013, 14:30
Цитата Сообщение от dzrkot Посмотреть сообщение
значит 2 раза читать
либо один раз, по символу или по нескольку символов, переодически перевыделяя память...
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
18.10.2013, 14:41
Если хотите работать с char* и в файле более одной строки! то можно написать вариант "для лаб": создать достаточно большой массив, считать в него, узнать длину строки в нем, скопировать в требуемый. Либо считывать два раза.

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

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

Если что, считывание строки - std::getline.
dzrkot, советую проверять наличие открытого файла
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
18.10.2013, 14:46
Цитата Сообщение от MrGluck Посмотреть сообщение
представляю как этот монстр будет насиловать ОС
смотря как сделать
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
18.10.2013, 14:49
Croessmah, постоянное перераспределение памяти это как туда-сюда, туда-сюда ....
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
18.10.2013, 14:55  [ТС]
Цитата Сообщение от 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++;
}
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
18.10.2013, 15:00
Цитата Сообщение от 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;
}
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
18.10.2013, 15:01  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
зачем вам третий параметр? Используйте перегруженную версию с двумя параметрами и со взятием строки до '\n'
не очень понел...
там на самом деле file.getline(strArray,n,'\n'); я так понимаю что он переписывает до первого '\n'
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2013, 15:26
Цитата Сообщение от dzrkot Посмотреть сообщение
там на самом деле file.getline(strArray,n,'\n');
Там, по-умолчанию, третий параметр '\n', поэтому писать его не обязательно.

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

Добавлено через 2 минуты
dzrkot, у вас задача, вообще, какая? И через что её можно делать? Есть ограничения?
в массив массивов char'ов записать из файла.txt строки, до '\n', после чего из выбранных строк у всех слов удалить первый символ
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.10.2013, 00:24
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 выглядело бы намного проще, но он может пробелы зажевать.
1
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
19.10.2013, 01:01  [ТС]
спасибо, я попробую разобраться в вашем коде попозже, я вот свой накатал, но там в конце неувязка

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ому элементу...хотя мб ошибаюсь
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.10.2013, 01:08
Цитата Сообщение от dzrkot Посмотреть сообщение
file.getline(a,n); // считываем туда строку до символа '\0' по умолчанию
До '\n'.
Цитата Сообщение от dzrkot Посмотреть сообщение
file.close(); // закрываем файл, т.к. прочитать его снова с 1ой строки иначе я не знаю как
C++
1
2
file.clear();
file.seekg(0);
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.10.2013, 01:10
Цитата Сообщение от dzrkot Посмотреть сообщение
что вроде массив char'ов в cout выводится весь, если обратиться к его 1ому элементу
смотря как обратиться. Если через указатель, то да. Если по индексу, то выведет элемент массива - букву.

Вам бы отступов расставить, я бы помог. Также советовал бы комментировать лишь то, о чем не может сказать код. Количество лишнего текста мозолит глаза.
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.10.2013, 01:24
Цитата Сообщение от dzrkot Посмотреть сообщение
file.getline(a,n); // считываем туда строку до символа '\0' по умолчанию
В файле, в конце строк нет '\0'. При записи в файл (строчными методами), терминальный ноль не записывается.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.10.2013, 01:24
Помогаю со студенческими работами здесь

Даны два файла, получить третий, содержащий чётные строки первого файла и нечётные строки второго файла
Даны два файла, получить третий, содержащий чётные строки первого файла и нечётные строки второго файла.

Даны два файла, получить третий, содержащий чётные строки первого файла и нечётные строки второго файла
Даны два файла, получить третий, содержащий чётные строки первого файла и нечётные строки второго файла. Вообще не имею понятия, как...

Определить размер файла, и если этот размер меньше определенного, скопировать этот файл в другой каталог
Задача: определить размер файла по указанному пути, и если этот размер меньше определенного скопировать этот файл в другой каталог. ...

Нужно считать размер квадратной матрицы из файла.Размер заранне считать не известным
КУ всем.Нужна помощь,как считать из условного файла file.txt, где есть матрица, её размер, назовём его x.Так вот,нужно считать размер...

Вывести на экран строки, размер которых больше среднего размера строки в файле.
1)Организовать текстовый файл, состоящий из N строк. Вывести на экран строки, размер которых больше среднего размера строки в файле.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru