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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
kia001
0 / 0 / 0
Регистрация: 24.07.2012
Сообщений: 9
#1

Дополнение char строк пробелами при записи их в файл - C++

30.07.2012, 06:11. Просмотров 1199. Ответов 4
Метки нет (Все метки)

Пытаюсь написать простенькую прогу, создающую базу данных имен и номеров сотрудников в файле. Столкнулся со следующей проблемой: при записи строк, имеющих длину меньше длины массива, в файл они дополняются мусором - примерно так: Ivan ММММММММММIvanov ММММММММ12345 МММММММММ.
При попытке их последующего получения из файла и записи в переменные они также имеют мусорные символы.

Собственно вопрос - как этого можно избежать?

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
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
 
int main()
{
    int num = 0;
    
    char fname[15];
    char lname[15];
    char number[15];
 
    cout << "Enter employee first name: ";
    cin.getline(fname, 15);
 
    cout << "Enter employee last name: ";
    cin.getline(lname, 15);
 
    cout << "Enter employee phone number: ";
    cin.getline(number, 15);
 
    cout  << fname << " " << lname << " " << number << "\n";
 
    ofstream out("testdb.txt", ios::out | ios::binary);
    if(!out){cout << "Unable to open database file.\n"; return 1;}
 
    out.seekp((50*num), ios::beg);
    out.write(fname, 15);
    out.seekp((50*num)+15, ios::beg);
    out.write(lname, 15);
    out.seekp((50*num)+30, ios::beg);
    out.write(number, 15);
 
    out.close();
 
    ifstream in ("testdb.txt", ios::in | ios::binary);
    if(!in){cout << "Unable to open database file.\n"; return 1;}
 
    in.seekg((50*num), ios::beg);
    in.getline(fname, sizeof fname);
    in.seekg((50*num)+15, ios::beg);
    in.getline(lname, sizeof lname);
    in.seekg((50*num)+30, ios::beg);
    in.getline(number, sizeof lname);
    
    cout  << fname << " " << lname << " " << number << "\n";
 
    in.close();
 
    system("PAUSE");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2012, 06:11     Дополнение char строк пробелами при записи их в файл
Посмотрите здесь:

Ввод длинных строк с пробелами C++
C++ Ошибка при записи в файл
C++ Ошибка при записи в файл
Дополнение строк в тестовом файле C++
C++ Считывание нескольких строк с пробелами
C++ Перевод строк при их записи в текстовый файл
Ошибка при посимвольной записи из строки char в строку string C++
C++ Ввод строки char с пробелами
C++ Равномерное дополнение строки пробелами
C++ Абракадабра при записи в файл и при чтении из него кириллицы
Ввод строки с пробелами в поле char c++ C++
Считывание нескольких строк с пробелами C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5411 / 4807 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 06:51     Дополнение char строк пробелами при записи их в файл #2
Ну, например, записать ввод так:
C++
1
2
3
4
5
6
out.seekp((50*num), ios::beg);
out.write(fname, strlen(fname));
out.seekp((50*num)+15, ios::beg);
out.write(lname, strlen(lname));
out.seekp((50*num)+30, ios::beg);
out.write(number, strlen(number));
И в 45 строке описка. Наверное, должно быть
C++
1
in.getline(number, sizeof number);
kia001
0 / 0 / 0
Регистрация: 24.07.2012
Сообщений: 9
30.07.2012, 06:57  [ТС]     Дополнение char строк пробелами при записи их в файл #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Ну, например, записать ввод так:
C++
1
2
3
4
5
6
out.seekp((50*num), ios::beg);
out.write(fname, strlen(fname));
out.seekp((50*num)+15, ios::beg);
out.write(lname, strlen(lname));
out.seekp((50*num)+30, ios::beg);
out.write(number, strlen(number));
И в 45 строке описка. Наверное, должно быть
C++
1
in.getline(number, sizeof number);
Спасибо за ответ. Через 5 минут после создания темы я пришел к тому же решению Ж).

Другое дело, наверняка существуют и другие способы решения - может как-нибудь изменить форматирование ввода, чтобы переменные дополнялись нужным числом пробелов?
alsav22
5411 / 4807 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 08:23     Дополнение char строк пробелами при записи их в файл #4
Вы зря открываете файл для бинарного чтения и записи. Лучше так сделать:
Код
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
#include <iostream>
#include <fstream>
#include <cstring>
 
using namespace std;
 
int main()
{
    int num = 0;
    
    char fname[15];
    char lname[15];
    char number[15];
 
    cout << "Enter employee first name: ";
    cin.getline(fname, 15);
    
    cout << "Enter employee last name: ";
    cin.getline(lname, 15);
    
    cout << "Enter employee phone number: ";
    cin.getline(number, 15);
    
    cout  << fname << " " << lname << " " << number << "\n";
 
    ofstream out("testdb.txt");
    if(!out){cout << "Unable to open database file.\n"; return 1;}
 
    out.write(fname, strlen(fname));
    out.put('\n');
    out.write(lname, strlen(lname));
    out.put('\n');
    out.write(number, strlen(number));
    out.put('\n');
    out.close();
 
    ifstream in ("testdb.txt");
    if(!in){cout << "Unable to open database file.\n"; return 1;}
 
  
    in.getline(fname, sizeof(fname));
    in.getline(lname, sizeof(lname));
    in.getline(number, sizeof(number));
    
    cout  << fname << " " << lname << " " << number << "\n";
 
    in.close();
 
    system("PAUSE");
    return 0;
}


Добавлено через 26 минут
Запись в файл можно проще записать:
C++
1
2
3
4
5
6
out << fname;
out.put('\n');
out << lname;
out.put('\n');
out << number;
out.put('\n');
Цитата Сообщение от kia001 Посмотреть сообщение
переменные дополнялись нужным числом пробелов?
Пробелы не помогут. getline() для окончанчания чтения нужен символ новой строки ('\n'), или конец файла, или чтобы колличество считанных символов стало на 1 больше, чем задано в параметре (тогда ошибка). Но сам символ новой строки она не читает (имеется ввиду, что не помещает туда, куда считывает) , из потока извлекает и всё. В массивах char его не будет. Поэтому, при записи в файл, строки нужно дополнять символом '\n', чтобы потом getline() нормально их считывала.
kia001
0 / 0 / 0
Регистрация: 24.07.2012
Сообщений: 9
30.07.2012, 08:32  [ТС]     Дополнение char строк пробелами при записи их в файл #5
Спасибо за такой развернутый ответ. Насчет бинарного ввода - я просто с ним сейчас разбираюсь, потому и использую. Без него наверное да, получилось бы экономнее.
Yandex
Объявления
30.07.2012, 08:32     Дополнение char строк пробелами при записи их в файл
Ответ Создать тему
Опции темы

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