Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 24.07.2012
Сообщений: 9
1

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

30.07.2012, 06:11. Просмотров 1886. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.07.2012, 06:11
Ответы с готовыми решениями:

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

Файлы, дополнение строк пробелами
Считая что не пустой текстовый файл t не пустой разбит на строки длина каждой из которых не...

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

Дублирование строк при записи в файл из DataGridView
Не понятно почему 2 первые строки одинаковые выведены в текстовый файл? когда в DataGridView1...

4
5473 / 4868 / 831
Регистрация: 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
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
5473 / 4868 / 831
Регистрация: 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
0 / 0 / 0
Регистрация: 24.07.2012
Сообщений: 9
30.07.2012, 08:32  [ТС] 5
Спасибо за такой развернутый ответ. Насчет бинарного ввода - я просто с ним сейчас разбираюсь, потому и использую. Без него наверное да, получилось бы экономнее.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.07.2012, 08:32

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

Файл записи о книгах: дополнение в хвост, поиск по автору и печать файла на экран
Создать файл записи о книгах. И сделать следующие функции :Операция ввода, дополнения в хвост,...

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

Дополнение пробелами текстовых полей
Как сделать чтобы при запросе к базе поля выдавались с фактическими значениями, а не дополненные...

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


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

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

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