Page 1 of 2

C++ и ASCII коды

Posted: 2006-11-14 18:02:40
by Scripts Writer
Собственно вопрос в следущем.
Есть код лаб. работы, которая берёт из файла данные и заносит их в таблицу в другой файл:

Что берём:

Code: Select all

                        ИСХОДНЫЕ   ДАННЫЕ
╔══════════╤══════════╤══════════╤══════════╤══════════╤══════════╗
║ ДАННЫЕ 1 │ ДАННЫЕ 2 │ ДАННЫЕ 3 │ ДАННЫЕ 4 │ ДАННЫЕ 5 │ ДАННЫЕ 6 ║
╠══════════╪══════════╪══════════╪══════════╪══════════╪══════════╣
╟──────────┼──────────┼──────────┼──────────┼──────────┼──────────╢
╚══════════╧══════════╧══════════╧══════════╧══════════╧══════════╝
1.34        33.5        312        44        -1.0E-3        46 
56.89        4.32        7.e-2        67        450        14.85
67        4        -3.879        3.2        -436        67
0.2        6.4        -44        1.23        0.55        1.2E-3
1.578        0.25        4.5        0.45        -5.44        2.36

Что получается:

Code: Select all

                        ИСХОДНЫЕ   ДАННЫЕ
╔══════════╤══════════╤══════════╤══════════╤══════════╤══════════╗
║ ДАННЫЕ 1 │ ДАННЫЕ 2 │ ДАННЫЕ 3 │ ДАННЫЕ 4 │ ДАННЫЕ 5 │ ДАННЫЕ 6 ║
╠══════════╪══════════╪══════════╪══════════╪══════════╪══════════╣
1.34      33.5      3.12e+02  44        -0.001    46       
╟──────────┼──────────┼──────────┼──────────┼──────────┼──────────╢
56.89     4.32      7e-02     67        450       14.85     
╟──────────┼──────────┼──────────┼──────────┼──────────┼──────────╢
67        4         -3.879e+003.2       -436      67       
╟──────────┼──────────┼──────────┼──────────┼──────────┼──────────╢
0.2       6.4       -4.4e+01  1.23      0.55      0.0012   
╟──────────┼──────────┼──────────┼──────────┼──────────┼──────────╢
1.578     0.25      4.5e+00   0.45      -5.44     2.36     
╚══════════╧══════════╧══════════╧══════════╧══════════╧══════════╝


Собственно код программы выводит шапку таблицы, затем содержимое через символы с кодом │ и в конце каждой строки с данными массива по идее ставит ║.

Проблема вот в чём:
Не выводит в файле эти 2а символа.В начале строки должен быть символ-он игнорируется пустым местом,между элементами и в конце также. Ни 10,ни 8, ни 16 ричный код этих символов С++ выводить не хочет, однако совсем остальным проблем нет, и забитую по стандарту шапку имеющую такие символы выводит без проблем.

В чём мб проблема? Кодировка тхт файла может влиять или еще что?

Posted: 2006-11-14 18:10:41
by Scripts Writer
Да простит меня цензура, но если подставить не эти 2 кода, а какое нибудь слово на их место то результат на лицо ...

Code: Select all

                        ИСХОДНЫЕ   ДАННЫЕ
╔══════════╤══════════╤══════════╤══════════╤══════════╤══════════╗
║ ДАННЫЕ 1 │ ДАННЫЕ 2 │ ДАННЫЕ 3 │ ДАННЫЕ 4 │ ДАННЫЕ 5 │ ДАННЫЕ 6 ║
╠══════════╪══════════╪══════════╪══════════╪══════════╪══════════╣
gavno1.34      gavno33.5      gavno3.12e+02  gavno44        gavno-0.001    gavno46        gavno
╟──────────┼──────────┼──────────┼──────────┼──────────┼──────────╢
gavno56.89     gavno4.32      gavno7e-02     gavno67        gavno450       gavno14.85     gavno
╟──────────┼──────────┼──────────┼──────────┼──────────┼──────────╢
gavno67        gavno4         gavno-3.879e+00gavno3.2       gavno-436      gavno67        gavno
╟──────────┼──────────┼──────────┼──────────┼──────────┼──────────╢
gavno0.2       gavno6.4       gavno-4.4e+01  gavno1.23      gavno0.55      gavno0.0012    gavno
╟──────────┼──────────┼──────────┼──────────┼──────────┼──────────╢
gavno1.578     gavno0.25      gavno4.5e+00   gavno0.45      gavno-5.44     gavno2.36      gavno
╚══════════╧══════════╧══════════╧══════════╧══════════╧══════════╝

Posted: 2006-11-14 19:06:50
by DerMeister =)
Код выложи. Я тогда у папы спрошу.

ЗЫ: А не перле нельзя?

Posted: 2006-11-14 19:24:22
by Scripts Writer
Нет. Это моя лаб. работа. Сейчас код кину ...

Posted: 2006-11-14 19:25:51
by Scripts Writer

Code: Select all

#include<fstream.h>
#include<stdlib.h>
#include<conio.h>
#include<iomanip.h>

const int m=5, n=6;
ifstream fin;
ofstream fout;
char c[6][202];

void main()
 {clrscr();
  fin.open("gg.txt"); # Откуда берём информацию
  if(!fin) {cout<<"Error when file was opening for reading"; exit(1);}

  fout.open("gg.res"); # Куда записываем
  if(!fout) {cout<<"Error when file was open for record";exit(1);}

 float a[m][n];
 int i,j;

 void vvod(float a[m][n]);
 void p(float a[m][n]);
 vvod(a);
 p(a);
 fout.close();
}


void vvod(float a[m][n])
{
  int i,j;
   for(i=0;i<6;i++)
    {

     fin.getline(c[i],203);
     if(i<4)
      fout<<c[i]<<endl;
    }
     for(i=0;i<m;i++)
     for(j=0;j<n;j++)
     fin>>*(*(a+i)+j);
     fin.close();
}

  void p(float a[m][n])
  {
   int i,j;
   for(i=0;i<m;i++)
   {
    fout<<'\xBA'; # ║ -не выводит
    for(j=0;j<n;j++)
    switch(j)
     { case 0: case 1: case 3: case 4:
      fout.width(10);
      fout.setf(ios::left|ios::fixed);
      fout.precision(5);
      fout<<a[i][j]<<'\xB3'; # | -не выводит
      break;
      case 2:
      fout.width(10);
      fout.setf(ios::scientific);
      fout.precision(4);
      fout<<a[i][j];fout<<'\xB3'; # | -не выводит
      break;
      case 5:
      fout.width(10);
      fout.precision(4);
      fout<<a[i][j]<<"\xB3\n"; # | -не выводит
      break;
    }
   if(i==m-1)
    fout<<c[5]<<endl;
   else
    fout<<c[4]<<endl;
  }
 }

Posted: 2006-11-14 19:47:12
by Savage
А если просто текстовый вариант этих символов печатать?

Posted: 2006-11-14 19:52:39
by Scripts Writer
Если в коде программы напечатать эти символы ? -Через Alt + 186 (если не ошибаюсь) -выводится символ ║ и как строковая " ║ " в тхт всё равно не записывается =\ остаётся пустым местом.

Posted: 2006-11-14 20:17:21
by DerMeister =)
Хммм:

Code: Select all

fout<<'║'

А так разве не работает?

Если тебе чтото это скажет, то:

Code: Select all

std::ofstream os("somefile.txt");
os << << '║';

Posted: 2006-11-14 20:27:07
by Scripts Writer
Ничего не говорит =\

Posted: 2006-11-14 20:43:31
by Scripts Writer
Выводит следующим образом:

" | " -как символ OR. Однако мне надо кодом символа. =\ В чём трабла мб?! =\

Posted: 2006-11-14 21:18:32
by Savage
Поговори об этом с ваше преподшей, и ей приятно будет что ктото пытается вкурить в ее предмет и тебе голову ломать над пустяками не прийдется. :) Как ее там, Лала вроде, если не ошибаюсь.

Posted: 2006-11-14 21:30:40
by DerMeister =)
Savage wrote:Поговори об этом с ваше преподшей, и ей приятно будет что ктото пытается вкурить в ее предмет и тебе голову ломать над пустяками не прийдется. :) Как ее там, Лала вроде, если не ошибаюсь.

Не, не надо. Счас смастерим!
Только я не понял, по заданию тебе обязательно коды ASCII использовать?

Posted: 2006-11-14 21:41:08
by Scripts Writer
Отклонение в запятую карается смертью на защите лабараторной работе по её предмету.
Если у неё в Методичке указаны коды:
'\263' и '\272' значит так надо. Иначе не засчитает :\ я бы и рад самодеятельностью заняться-да не получится.

Posted: 2006-11-14 21:44:17
by DerMeister =)
А попробуй '\xBA' на '\xA6' поменяь

Posted: 2006-11-14 21:53:21
by Scripts Writer
Без результата

Posted: 2006-11-14 21:58:00
by Savage
А может 0xBA надо?

Posted: 2006-11-14 22:07:07
by Scripts Writer
Savage wrote:А может 0xBA надо?

Не.

Код символа ║ -это

(186)10 = (272)8 = (BA)16

Соответственно в дестеричной8 и 16 ричной системах счисления.
16рич вид такого кода это '\xHH' -где H это любое число от 0 до 16.
Я пробовал 8,10 и 16 ричные коды записи этого символа в программе но ничего не выходило.

Мб всё таки вопрос в кодировке или чём то еще, не относящемся к С++?

Posted: 2006-11-14 22:34:38
by Savage
Лень ставить билдер. Наверняка какой-нить пустяк мешает те нормальн отдыхать :)

Posted: 2006-11-14 22:46:21
by DerMeister =)
ты знаешь, тут кокраз в кодировке может быть дело.
║ - для меня это 2 вертикальные черты.
Когда я делаю ctrl+c на форуме и ctrl+v в far'е, то там у меня получается одна вертикальная черта ( | ) , но не такая, как эта, а другая, но тоже одна и вертикальная. + в зависамости от кодировки (win/dos == win-1251/cp866) шестнадцатиричный код меняется. (A6/B3). Тобишь тебе сначало нужно понять в какой кодировке Си хочет видет код асции. А видеть он хочет коды в кодировке "по умолчанию". Для винды это (стандартно) win-1251.

Вообще, попробуй "пройти" все возможные коды АСКИ и посмотри что тебе выведется на экран.

Code: Select all

for (int i = 0; i <= 255; ++i) {
char c = i;
std::cout << c;
}


-----------------------------------------------------

Кстати, вместо

Code: Select all

fout<<'\xa6';

можно

Code: Select all

fout << char(0xa6);


-----------------------------------------------------
А может ошибка вовсе не в кодировке?
Может ты гже то код напутал?
Мне вот это не нравится (я в си не разбираюсь):

Code: Select all

{ case 0: case 1: case 3: case 4: #почему тут 0,1,3,4 ? почему не по порядку?
      fout.width(10);
      fout.setf(ios::left|ios::fixed);
      fout.precision(5);
      fout<<a[i][j]<<'\xB3'; # | -не выводит
      break;
      case 2:
      fout.width(10);
      fout.setf(ios::scientific);
      fout.precision(4);
      fout<<a[i][j];fout<<'\xB3'; # | -не выводит
      break;
      case 5:
      fout.width(10);
      fout.precision(4);
      fout<<a[i][j]<<"\xB3\n"; # | -не выводит
      break;
    }


ЗЫ: И помни, что 0xA6 и 0хА6 это совсем разные вещи!!!!! ;)

Posted: 2006-11-15 00:53:34
by omi4
fprintf() не проще использовать?
Пусть компилятор разбирается с кодами символов.