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

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

Войти
Регистрация
Восстановить пароль
 
 
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,998
#1

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

18.10.2013, 14:18. Просмотров 818. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2013, 14:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос размер считываемой строки из файла (C++):

Удвоить размер файла, записав в конец файла все его исходные элементы - C++
Дан файл целых чисел. Удвоить его размер, записав в конец файла все его исходные элементы (в том же порядке). Помогите пожалуйста!!!!

Добавлять в исходную строку заданной длины новые строки, пока не будет превышен размер исходной строки - C++
Описать строку из 50 символов. В цикле запрашивать у пользователя строки длиной до 10 символов и добавлять их к исходной до тех пор, пока...

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

Переделать функцию поиска самой длинной строки так, чтобы она правильно печатала размер произвольно длинной входной строки и воспроизводила ее - C++
Переделать головную функцию поиска самой длинной строки так, чтобы она правильно печатала размер произвольно длинной входной строки...

Размер строки - C++
Дается строка в одном файле. Допустим, data1.txt . Нужно найти длину строки и записать в другой файл( data2.txt). Хочется по простому, на...

Размер файла - C++
Добрый день , нужно получить размер файла мой код пишет что-то не внятное значение 1787408944 #include &lt;sys/stat.h&gt; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,929
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 выглядело бы намного проще, но он может пробелы зажевать.
1
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,998
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ому элементу...хотя мб ошибаюсь
0
alsav22
5420 / 4816 / 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);
0
MrGluck
Модератор
Эксперт CЭксперт С++
7239 / 4407 / 642
Регистрация: 29.11.2010
Сообщений: 11,929
19.10.2013, 01:10 #19
Цитата Сообщение от dzrkot Посмотреть сообщение
что вроде массив char'ов в cout выводится весь, если обратиться к его 1ому элементу
смотря как обратиться. Если через указатель, то да. Если по индексу, то выведет элемент массива - букву.

Вам бы отступов расставить, я бы помог. Также советовал бы комментировать лишь то, о чем не может сказать код. Количество лишнего текста мозолит глаза.
1
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.10.2013, 01:24 #20
Цитата Сообщение от dzrkot Посмотреть сообщение
file.getline(a,n); // считываем туда строку до символа '\0' по умолчанию
В файле, в конце строк нет '\0'. При записи в файл (строчными методами), терминальный ноль не записывается.
1
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,998
19.10.2013, 13:29  [ТС] #21
фуф, разобрался вроде...выкладываю, мб кому потом пригодится
подправил стиль оформления немного

Не по теме:

кол-во комментов было исключительно для людей, которым это мб пригодится в будущем


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
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
const int n=200;//размер буфера
int c; // счетчик для кол-ва символов в строке
int i=0; // счетчик кол-ва строк
 
ifstream file;
file.open("text.txt");
    while(!file.eof()) // цикл для чтения из файла до его конца, считаем кол-во строк
    {
    char* a=new char[n]; // буфер для считывания в него файла
    file.getline(a,n);
    delete []a;
    i++;
    }
file.clear();
file.seekg(0);
char** b=new char*[i];  // массив для хранения массивов со строками
i=0;
    while(!file.eof())
    {
    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];  //выделяем память под массив хранящий символы
        for (int j=0;j<=c;j++)   // в цикле посимвольно записываем в наш массив буфер а[]
        {
        d[j]=a[j];
        cout<<d[j];
        }
    d[c+1]='\0';
    b[i]=d;       // присваиваем главному массиву адреса массивов с символами
    cout<<"i="<<i<<endl;
    delete []a;
    i++;
    }
cout<<"\n"<<endl;
 
    for (int j=0;j<i;j++) // выводим главный массив со стркоами
    {
//всё решилось само собой, пол часа поломал голову, обращался к
//несуществующей области памяти в циклац for, отсюда была куча ошибок и прочего
        *(b[j])=' ';
        for (int i=0;;i++)
        {
            if ((*(b[j]+i)==' ')&&(*(b[j]+i-1)!=' '))
                *(b[j]+i+1)=' ';
            if (*(b[j]+i)=='\0')
            break;
        }
    }
cout<<endl;
    for (int j=0;j<i;j++)
    cout<<b[j]<<endl;
delete [] b;
file.close();
return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2013, 13:29
Привет! Вот еще темы с ответами:

Размер файла - C++
Как узнать размер файла в Си++/Си? кроме функции GetFileSize

Размер файла - C++
Привет всем. мне нужно создать массив, в который будут считываться интовые значения из файла. для этого мне нужно знать размер этого файла....

Размер файла - C++
Скрипт, который находит размер всех файлов указанного типа на указанном диске.(можно и 1 файла) вот мне нада узнать размер D:\1.txt

размер файла - C++
Господа!!! прям проблема у меня. не могу получить размер файла через GetFileSize. #include&quot;windows.h&quot; int __stdcall WinMain(HINSTANCE...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.10.2013, 13:29
Ответ Создать тему
Опции темы

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