Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/140: Рейтинг темы: голосов - 140, средняя оценка - 4.59
1 / 1 / 1
Регистрация: 30.10.2017
Сообщений: 34

Считывание из файла вместе с пробелами

03.11.2017, 22:04. Показов 30970. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, у меня есть проблема. Я работаю над проектом и мне нужно считать информацию из файла в массив char. Но во время считывание, ни один из мне известных методов не считывает пробелы. Предварительная замена пробелов для последующей обратной замены не возможна в реализации. Как разобраться с проблемой невозможности преобразований типов const char и 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
void FindName() {
 
    char *Name = new char[10];
 
    printf("\n\n-ПОИСК ИНФОРМАЦИИ ЗА ИМЕНЕМ-\n");
 
    printf("Имя:\n");
    
    fgetc(stdin);
    fgets(Name, 30, stdin);
 
    printf("\n------------------------\n");
    printf(":\n");
 
    char All[100];
    
    fstream file;
    file.open("0.txt", ios::in);
    int i = 0;
    while (!file.eof()) {
        file >> All[i];
        i++;
    }
    file.close();
    All[i - 1] = 0;
 
    cout << All;
 
    cout << endl;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.11.2017, 22:04
Ответы с готовыми решениями:

Считывание вместе с пробелами
Столкнулся с одной проблемой при считывании из файла программа считает пробелы символами разделителями ifstream...

Считывание из файла с пробелами
Здравствуйте. Нужно считать из файла сообщение, в котором заранее известны что будут пробелы. Например. 123 45 6. Вопрос как...

Считывание файла с пробелами.
Подскажите, пожалуйста, как при считывание текстового файла сохранить пробелы между словами. Темы видел но так и не понял.

16
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
03.11.2017, 22:09
Цитата Сообщение от _Sora_ Посмотреть сообщение
ни один из мне известных методов не считывает пробелы
fgets() берёт строку целиком.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
03.11.2017, 22:11
std::getline
0
1 / 1 / 1
Регистрация: 30.10.2017
Сообщений: 34
03.11.2017, 22:25  [ТС]
Да но без пробелов. Если данные были "1 1 1" то массив складывается с 3 элементов "1"

Добавлено через 6 минут
Цитата Сообщение от Pechkin80 Посмотреть сообщение
std::getline
Можно пожалуйста по подробнее? Если я не ошибаюсь, getline считывает строку string, а мне нужен массив char.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
03.11.2017, 22:27
http://www.cplusplus.com/refer... m/getline/
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
03.11.2017, 22:30
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
    // Указатель на файловый поток
    std::ifstream m_fs; // в классе объявляем
{
    const char * c_delimiter = "/n";
    std::stringstream * istrstm = NULL;
    std::string lexema = "";
 
    m_fs.open(m_inputdata.fname.c_str());
    if (m_fs.is_open())
    {
        istrstm = new std::stringstream();
        *istrstm << m_fs.rdbuf();
        m_fs.close();
    }
    if (istrstm)
    {
        while (getline((*istrstm),lexema,c_delimiter) != 0)
        {
            if (lexema.empty())
            {
               continue;
            }
///
    }
1
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
04.11.2017, 09:44
Цитата Сообщение от _Sora_ Посмотреть сообщение
char *Name = new char[10];
fgets(Name, 30, stdin);
Не делайте так больше. Вы разрешаете, явным образом разрешаете, выход за пределы массива. В лучшем случае это сразу приведет к сегфолту.
Согласен с nmcf: fgets берет строку целиком со всеми пробелами, табуляциями, спецсимволами, даже финальным переводом строки.
1
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
04.11.2017, 10:39
Лучший ответ Сообщение было отмечено _Sora_ как решение

Решение

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
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
 
    ifstream f("name.txt");
 
    //читаем всё в строку s
    string s="",s1;
    while (getline(f, s1))
        s += s1;
    f.close();
//s - фактически есть динамический символьный массив.
    //но, eсли Вам нужен отдельный char-массив, то:
    char *c = new char[s.length()];
    for (int i = 0; i <= s.length(); i++)
        c[i] = s[i];
    
    cout << s << endl << c << endl;
    system("pause");
    return 0;
}
1
1 / 1 / 1
Регистрация: 30.10.2017
Сообщений: 34
04.11.2017, 15:07  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Не делайте так больше. Вы разрешаете, явным образом разрешаете, выход за пределы массива. В лучшем случае это сразу приведет к сегфолту.
Простите, а как мне поступить если я не знаю сколько будет занимать Name?
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Согласен с nmcf: fgets берет строку целиком со всеми пробелами, табуляциями, спецсимволами, даже финальным переводом строки.
Простите, но почему тогда в итоге у меня массив char складается только из элементов которые не включают пробелы.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.11.2017, 16:25
Цитата Сообщение от _Sora_ Посмотреть сообщение
как мне поступить если я не знаю сколько будет занимать Name?
Ну какой-то разумный предел предполагается же?
Цитата Сообщение от _Sora_ Посмотреть сообщение
почему тогда в итоге у меня массив char складается только из элементов которые не включают пробелы
Что в файле?
0
1 / 1 / 1
Регистрация: 30.10.2017
Сообщений: 34
04.11.2017, 17:09  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Что в файле?
1_1_1 _-пробел
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.11.2017, 17:53
#include <cstring>
#include <fstream>

ifstream file(FileName); //открыть для чтения в текстовом режиме
file.getline(S,len);

S - символьная строка
len - максимальная длина строки.


Вдруг поможет.

И мне, например, не ясно. Вы хотите по строкам: каждая строка - это массив, или просто весь файл в символьный массив? Судя по коду, хотели построчно.
1
1 / 1 / 1
Регистрация: 30.10.2017
Сообщений: 34
04.11.2017, 19:02  [ТС]
Цитата Сообщение от daslex Посмотреть сообщение
И мне, например, не ясно. Вы хотите по строкам: каждая строка - это массив, или просто весь файл в символьный массив? Судя по коду, хотели построчно.
Спасибо. У меня есть файл, где через пробел указаны имя фамилия номер телефона, мне нужны пробелы чтобы считывать информацию, что-то типа до первого пробела - имя1 ко второму от первого фамилия1 и так дальше.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
04.11.2017, 19:12
Тогда используй fscanf() для первого варианта или >>.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.11.2017, 20:28
Лучший ответ Сообщение было отмечено _Sora_ как решение

Решение

Как-то мутно всё очень. Сильно напоминает необходимость использования массива структур и незнание о массиве структур.
Вот то, что Вы описываете - это массив структур, хранимый в файле.


Для бинарного режима
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
#include <fstream>
#include <iostream>
 
using namespace std;
 
/*Структура должна соответствовать структуре данных, хранимых в файле*/
struct MyStruct{
    char FirstName[155];       //Это символьная строка в 155 символов
    char LastName[155];        //Это символьная строка в 155 символов
    char phone[25];            //Это символьная строка в 25 символов
};
 
 
int main(){
 
    const char* FName = "file.txt";     //Это Ваш файл
    MyStruct X[3];
 
    ifstream file("file", ios::binary);
        file.read((char*)&X, sizeof(X));
    file.close();
 
  
   /*Ну, тут вообще цикл нужен, я для упрощения*/
    cout << X[0].FirstName << ' ' << X[0].LastName << ' ' << X[0].phone << '\n';
    cout << X[1].FirstName << ' ' << X[1].LastName << ' ' << X[1].phone << '\n';
    cout << X[2].FirstName << ' ' << X[2].LastName << ' ' << X[2].phone << '\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
#include <fstream>
#include <iostream>
 
using namespace std;
 
struct MyStruct{
    char FirstName[155];       //Это символьная строка в 155 символов
    char LastName[155];        //Это символьная строка в 155 символов
    char phone[25];            //Это символьная строка в 25 символов
};
 
 
int main(){
 
 
    const char* FName = "file.txt";     //Это Ваш файл
    MyStruct X[3];
 
 
    ofstream of("file");
    MyStruct T[3] = {
        {
            "Ivanov",
            "Petr",
            "778889"
        },
        {
            "Alex",
            "Sidorow",
            "45667"
        },
        {
            "DNMO",
            "Alekseew",
            "9983377"
        }
    };
 
    for (int i=0; i<3; i++)
    of << T[i].FirstName << ' ' << T[i].LastName << ' ' << T[i].phone << ' ';
    of.close();
 
 
    int index=0;
    ifstream file("file");
        while (!file.eof()){
            file >> X[index].FirstName >> X[index].LastName >> X[index].phone;
            index++;
        }
    file.close();
 
    for (int i=0; i<3; i++){
        cout << X[i].FirstName << ' ' << X[i].LastName << ' ' << X[i].phone << '\n';
    }
 
}


У Вас же в коде используется операция >>, она работает до первого пробела.

Вы сами себя запутали:
Цитата Сообщение от _Sora_ Посмотреть сообщение
Но во время считывание, ни один из мне известных методов не считывает пробелы.
Т. е. или Вам пробелы действительно нужны (например, для чтения строки непосредственно с пробелами).

Или:
Цитата Сообщение от _Sora_ Посмотреть сообщение
У меня есть файл, где через пробел указаны имя фамилия номер телефона
Вам пробелы не нужны в принципе, они нужны в файле для разделения, но никак не Вам.

Я думаю, что Вам пробелы не нужны.
1
1 / 1 / 1
Регистрация: 30.10.2017
Сообщений: 34
04.11.2017, 21:06  [ТС]
Цитата Сообщение от daslex Посмотреть сообщение
Сильно напоминает необходимость использования массива структур и незнание о массиве структур.
Вот то, что Вы описываете - это массив структур, хранимый в файле.
Вы правы, простите. Я не знал, забыл о существовании структур массивов, спасибо. Это же насколько проще, но я уже сделал по своему, по этому ещё раз спасибо, мой вариант вот так:
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
82
83
#define _CRT_SECURE_NO_WARNINGS
 
#include "stdafx.h"
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <string>
#include <io.h>
#include <stdlib.h>
 
using namespace std;
 
void FindName() {
 
    char Name[20];
 
    printf("\n\n--\n");
 
    printf(": \n");
    
    fgetc(stdin);
    fgets(Name, 20, stdin);
 
    printf("\n------------------------\n");
    printf(":\n");
    
    fstream file;
    file.open("0.txt", ios::in);
 
    string s = "", s1;
    while (getline(file, s1))
        s += s1;
    file.close();
 
    char *all = new char[s.length()];
    for (int i = 0; i <= s.length(); i++) {
        all[i] = s[i];
    }
    
    int k[15];
    int m = 0;
    for (int i = 0; i <= sizeof(all); i++) {
        if (all[i] == ' ') {
            k[m] = i;
            m++;
        }
    }
 
    char *c = new char[20];
    int Fin;
    for (int i = 0; i < m; i + 3) {
        int l = 0;
        bool b = true;
        for (int j = k[i] + 1; j < k[i + 1]; j++) {
            c[l] = all[j];
            l++;
        }
        for (int j = 0; j < l; j++) {
            if (c[j] != Name[j])
                b = false;
            if (b == false)
                break;
        }
        if (b == true) {
            Fin = i;
            break;
        }
    }
 
    for (int i = Fin; i < Fin + 3; i++) {
        int l = 0;
        for (int j = k[i] + 1; j < k[i + 1]; j++) {
            c[l] = all[j];
            l++;
        }
    }
 
    cout << ": " << c[0] << endl;
    cout << ": " << c[1] << endl;
    cout << ": " << c[2] << endl;
 
    cout << endl;
}
0
04.11.2017, 21:16

Не по теме:

Извиняться не за что. Просто научитесь использовать массив структур. И используйте, когда будет нужно.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.11.2017, 21:16
Помогаю со студенческими работами здесь

Чтение строки вместе с пробелами
Всем привет. string str1;cin&gt;&gt;str1; int len1 = str1.length(); cout&lt;&lt;len1; string str1=&quot;Hello world&quot;; int len1 = str1.length(); ...

Узнать, сколько символов в строке (вместе с пробелами)
как узнать сколько символов в строке(вместе с пробелами)?и если потребуется сравнить сходное слово и перевернутое слово ? #include...

Считать символы из потока ввода вместе с пробелами
Всем привет. есть перегрузка ввода istream &amp;operator&gt;&gt; (istream &amp;input,book &amp;b) { cout&lt;&lt;&quot;Name of the book -...

Подсчитать в тексте символы, вместе с пробелами и точками
Помогите изменить программу. Она считает количество слов в тексте, нужно чтоб считала символы, вместе с пробелами и точками и.д....

Удалить из сообщения все однобуквенные слова (вместе с лишними пробелами)
Удалить из сообщения все однобуквенные слова (вместе с лишними пробелами). Помогите


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
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. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru