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

Cout выводит только первые 3-4 символа

08.10.2015, 21:19. Просмотров 1052. Ответов 10
Метки нет (Все метки)

Код записывает несколько слов в два двоичных файла, потом записывает их из файла в два указателя и должен выводить их на экран, но выводит только первые 3-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
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
#include<unistd.h>
using namespace std;
 
class tipyDR //названия типов
{
 public:
  char* nazv;//название
  static short koltipR;
  static short koltipD;
};
 short tipyDR::koltipR=0;
 short tipyDR::koltipD=0;
 
const char* tipyR = "./Рабочий_стол/Ghuj/dann/tipyR.zzu";
const char* tipyD = "./Рабочий_стол/Ghuj/dann/tipyD.zzu";
tipyDR* glavD;
tipyDR* glavR;
 
void prarka()           //заполняем файлы типами R и D
{
  FILE* e;
  short kol;
  if(!(e = fopen(tipyD, "rb")))
    { 
      e = fopen(tipyD, "ab");
      kol = 3;                         //колличество типов D
      fwrite(&kol, sizeof(short), 1, e);
      kol = 6;                       //колличество символов в названии типов
      fwrite(&kol, sizeof(short), 1, e);
      const char* nazv = "тип_а";
      fwrite(nazv, sizeof(char), kol, e);
      kol = 7;
      fwrite(&kol, sizeof(short), 1, e);
      nazv = "тип_аб";
      fwrite(nazv, sizeof(char), kol, e);
      kol = 6;
      fwrite(&kol, sizeof(short), 1, e);
      nazv = "тип_р";
      fwrite(nazv, sizeof(char), kol, e);
    }
  fclose(e);
  if(!(e = fopen(tipyR, "rb")))
    {
      e = fopen(tipyR, "ab");
      kol = 3;                        //колличество типов R
      fwrite(&kol, sizeof(short), 1, e);
      kol = 8;
      fwrite(&kol, sizeof(short), 1, e);
      const char* nazv = "тип_вап";
      fwrite(nazv, sizeof(char), kol, e);
      kol = 6;
      fwrite(&kol, sizeof(short), 1, e);
      nazv = "тип_3";
      fwrite(nazv, sizeof(char), kol, e);
      kol = 8;
      fwrite(&kol, sizeof(short), 1, e);
      nazv = "тип_мит";
      fwrite(nazv, sizeof(char), kol, e);
    }
  fclose(e);
}
 
tipyDR* zapolTip(bool rd) //заполняем названия типов_________________________________________________________________________
{
  const char* tipy;
  if(rd)
    {
      tipy = tipyD;
    }else
    {
      tipy = tipyR;
    }
  short kT;//счётчик кол-ва типов
  FILE *fayl;
  fayl = fopen(tipy, "rb"); //открываем файл указанный при обращении
  fread(&kT, sizeof(short), 1, fayl);
  if(rd)  //если хотим заполнить типы d
    {
      cout << kT << "типов d\n";
      sleep(3);
      tipyDR::koltipD = kT;
    }else  //если хотим заполнить типы r
    {
      cout << kT << " типов r\n";
      sleep(3);
      tipyDR::koltipR = kT;
    }
  short kolsim;
  tipyDR* glav = new tipyDR[kT];//список типов
  for(short i = 0; i < kT; i++)
    {
      fread(&kolsim, sizeof(short), 1, fayl);
      cout << kolsim << " символов\n";
      (glav + i) -> nazv = new char[kolsim];
      if(fread(glav[i].nazv, sizeof(char), kolsim, fayl))
    cout << (glav + i) -> nazv << "\n";
    }
  fclose(fayl);
  return glav;//возвращаем указатель на первый пункт
}
main(int nArg, char* pszArgs[])
{
  prarka();
  glavD = zapolTip(1);
  glavR = zapolTip(0);
  return 0;
}
выводит:
3типов d
6 символов
тип
7 символов
тип_
6 символов
тип
3 типов r
8 символов
тип_
6 символов
тип
8 символов
тип_
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.10.2015, 21:19
Ответы с готовыми решениями:

Почему std::cout выводит только 1 символ?
Привет ;) Почему выводит только 1 символ? #include &lt;iostream&gt; int main() { char ar =...

В файл пишет только первые два символа!
Всем доброго времени суток. Собственно задача:Провести транс-литерацию английского текста русскими...

Как из переменной с типом string получить только первые три символа
Такова задача нужно из переменной с типом string вытянуть только первые три символа, как это...

Подскажите почему после первого cout программа не останавливается для ввода строки, а выводит второй cout
Подскажите почему после первого cout программа не останавливается для ввода строки, а выводит...

10
0 / 0 / 0
Регистрация: 08.10.2015
Сообщений: 32
11.10.2015, 13:16  [ТС] 2
выяснил что на другом компе с тем же компилятором (g++) всё нормально. В чём может быть дело ещё?
0
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
11.10.2015, 14:54 3
А что отладчик показывает? Перед выводом в cout строка корректное значение содержит?
0
0 / 0 / 0
Регистрация: 08.10.2015
Сообщений: 32
11.10.2015, 15:12  [ТС] 4
отладчиком мне ещё предстоит научится пользоваться.
Выяснил пока что страдает запись в файл.
0
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
11.10.2015, 15:24 5
А это не Linux у тебя?
0
0 / 0 / 0
Регистрация: 08.10.2015
Сообщений: 32
11.10.2015, 15:30  [ТС] 6
linux
0
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
11.10.2015, 15:31 7
Лучший ответ Сообщение было отмечено Владимир М как решение

Решение

Если Linux, то там везде utf8 и записывать надо так:
C++
1
2
3
4
      const char* nazv = "тип_а";
      kol = strlen(nazv) + 1;
      fwrite(&kol, sizeof(short), 1, e);
      fwrite(nazv, sizeof(char), kol, e);
1
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
11.10.2015, 15:31 8
Лучший ответ Сообщение было отмечено Владимир М как решение

Решение

Если Linux, то там везде utf8 и записывать надо так:
C++
1
2
3
4
      const char* nazv = "тип_а";
      kol = strlen(nazv) + 1;
      fwrite(&kol, sizeof(short), 1, e);
      fwrite(nazv, sizeof(char), kol, e);
1
0 / 0 / 0
Регистрация: 08.10.2015
Сообщений: 32
11.10.2015, 15:41  [ТС] 9
Теперь всё стало ясно. Огромное Спасибо!

Добавлено через 2 минуты
а utf8 можно как-то поменять?
0
6913 / 5978 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
11.10.2015, 15:47 10
Цитата Сообщение от Владимир М Посмотреть сообщение
а utf8 можно как-то поменять?
Все современные Linux'ы на utf8. Может как-то и можно, только зачем? Если ты хочешь, чтобы строку можно было индексировать и считать длину по символам, используй wchar_t вместо char, wcout/wcin. в общем весь набор для широких символов.

Добавлено через 1 минуту
Этот вариант в любом случае лучше. Можно ведь и ошибиться где-то в цифрах, а так strlen() всё подсчитает.
0
0 / 0 / 0
Регистрация: 08.10.2015
Сообщений: 32
11.10.2015, 17:10  [ТС] 11
Ясно. Спасибо ещё раз!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2015, 17:10

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

Команда cout выводит не только текст ,но также какие-то "левые" отрицательные числа
Написал программу для вычисления корня(корней) квадратного уравнения. Почему-то, при попытке...

Оставить в файле только первые 3 вхождения символа *
type fs=file of char; Процедура First(var f1:tyfile) вашей программы оставляет в файле типа...

От заданного слова оставить только первые 3 символа
От заданного слова оставить только первые 3 символа.

Машина Маркова. Удалить из слова P первые 3 символа a и первые 2 символа b
A = {a,b,c}. Удалить из слова P первые 3 символа a и первые 2 символа b. Помогите решить задание...

почему выводит только свойства последнего символа?
CL-USER 1 &gt; (defun funca(x) (+ x 2)) FUNCA CL-USER 2 &gt; (defun funcb(x) (* x 2)) FUNCB ...

Описать и проверить работу процедуры first(t), которая оставляет в тексте t только первые вхождения каждого символа
type текст = file of char; Описать и проверить работу процедуры first(t), которая оставляет в...


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

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

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