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

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

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

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

30.07.2012, 06:11. Просмотров 1318. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2012, 06:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Дополнение char строк пробелами при записи их в файл (C++):

Перевод строк при их записи в текстовый файл - C++
Как сделать перевод строк при их записи в текстовый файл (CArchiv::WriteString())? не подойдет, т.к. редактор неформатированного текста...

Равномерное дополнение строки пробелами - C++
Всем доброго времени суток.Имеется задача: Дан текст из нескольких строк. Написать функцию, равномерно дополняющую строку пробелами до...

Ошибка при посимвольной записи из строки char в строку string - C++
Это фрагмент конструктора класса: ifstream fin(&quot;client.txt&quot;); const int n = 80; char buf; fin.getline(buf,...

Ввод строки char с пробелами - C++
Всем доброго дня. Подскажите плз, У меня есть указатель char *str как ввести в него строку с пробелами которую ввел пользователь. Класс...

Ввод строки с пробелами в поле char c++ - C++
Это часть файла header.h; В программе в поле Name нужно ввести ФИО с пробелами, но программа выдает только MMMMMMMM, если использовать...

Дополнение строк в тестовом файле - C++
Всем привет. Работаю над курсовым проектом, который строит таблицу из символов псевдографики. слова между ;; -ячейка таблицы ...

4
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 06:51 #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);
1
kia001
0 / 0 / 0
Регистрация: 24.07.2012
Сообщений: 9
30.07.2012, 06:57  [ТС] #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 минут после создания темы я пришел к тому же решению Ж).

Другое дело, наверняка существуют и другие способы решения - может как-нибудь изменить форматирование ввода, чтобы переменные дополнялись нужным числом пробелов?
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.07.2012, 08:23 #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() нормально их считывала.
1
kia001
0 / 0 / 0
Регистрация: 24.07.2012
Сообщений: 9
30.07.2012, 08:32  [ТС] #5
Спасибо за такой развернутый ответ. Насчет бинарного ввода - я просто с ним сейчас разбираюсь, потому и использую. Без него наверное да, получилось бы экономнее.
0
30.07.2012, 08:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2012, 08:32
Привет! Вот еще темы с ответами:

Баг при использовании класса string при записи в бинарный файл - C++
При записи в бинарный файл пользовательского класса, всё отлично отрабатывает, но, если в классе использовался класс string, то в конце...

Абракадабра при записи в файл и при чтении из него кириллицы - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main() { ofstream f(&quot;text.dat&quot;); f &lt;&lt; &quot;Тест&quot;; ...

Знаю что информация неправильно преобразовывается при записи в файл, скорее всего и при считывании тоже. Как это исправить? - C++
Знаю что информация неправильно преобразовывается при записи в файл, скорее всего и при считывании тоже. Как это исправить? Вот что...

Считывание нескольких строк с пробелами - C++
Я знаю, что есть функция getline. Но если мне в коде надо считать несколько разных строк с пробелами, что мне делать? Потому что при...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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