А, помогите!

 
RU Alesandro #03.12.2003 16:22
+
-
edit
 

Alesandro
Серокой

координатор
★★★★
 :blink:
Есть у меня файл вида

3C0A8000354A0200
340900AAA1490003
0000000000000000
3C08BFF734090030
A109000300000000
0000000000000000
910A000300000000
0000000042000020

Это 64-разрядные слова. В столбик. Надо считать их из файла (на Си) и, преобразовав в 32-разрядные, заслать куда надо. Уф. Вся задача в преобраховании. Я уже и fscanf пробовал, и strtoul - фигня получается - и всё...
Помогите советом, а?
(Си у меня абсолютно без наворотов, это Tornado для VxWorks).
Больше не раскалятся ваши колосники. Мамонты пятилеток сбили свои клыки. ©  

Vale

Сальсолёт

Кто тебе мешает

do {
считать 8 байт
преобразовать
считать 8 байт+eol
преобразовать
} while (!eof(f))
"Не следуй за большинством на зло, и не решай тяжбы, отступая по большинству от правды" (Исх. 23:2)  
RU Alesandro #03.12.2003 17:25
+
-
edit
 

Alesandro
Серокой

координатор
★★★★
Во-во, а КАК?
В общем, я вот так сделал:
code text
  1. ....
  2.  
  3. char indata[20];
  4. char s1[10], s2[10];
  5. unsigned long p1, p2;
  6.  
  7. ...
  8.  
  9. while (!feof(file1))
  10.         {
  11.  
  12.         fscanf(file1,"%s\n",indata);
  13.         strncpy (s1,indata,8);
  14.         sprintf(&(s1[8]),"\0");
  15.         strncpy (s2,&(indata[8]),10);
  16.         printf("in=%s, s1=%s, s2=%s\n", indata, s1, s2);
  17.         p1 = strtoul (s1, 0,16);
  18.         p2 = strtoul (s2, 0,16);
  19.         printf ("p1=%lx, p2=%lx\n", p1, p2);
  20.         }
Больше не раскалятся ваши колосники. Мамонты пятилеток сбили свои клыки. ©  
BG Реконструктор #03.12.2003 17:53
+
-
edit
 
Как должа выглядить хорошая программа:

code text
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define INPUT  "c:\\temp\\test.txt"
  5. #define CRLF_SIZE  1
  6. #define STR_SIZE  8
  7. #define DO_READ(size)   \
  8.         nReaded = fread(szBuff, 1, size, f); \
  9.         if (nReaded == 0) break
  10.  
  11. int main(int argc, char* argv[])
  12. {
  13.         char    szBuff[9];
  14.         long    nCounter = 0;
  15.         long    nReaded = 0;
  16.         char*   pszEndPtr;
  17.  
  18.         FILE* f = fopen(INPUT, "r");
  19.        
  20.         szBuff[8] = 0;
  21.  
  22.         for(;;)
  23.         {
  24.   if (nCounter++ == 2)
  25.   {
  26.        DO_READ(CRLF_SIZE);
  27.        nCounter = 0;
  28.   }
  29.   else
  30.   {
  31.        DO_READ(STR_SIZE);
  32.        long n = strtol(szBuff, &pszEndPtr, 16);
  33.  
  34.        printf("%d\n", n);
  35.   }
  36.         }
  37.  
  38.         fclose(f);
  39.  
  40.         return 0;
  41. }
 

Vale

Сальсолёт

Лишнего много.
Вообще самый компактный вариант -

считать строку(16+1 байт) в буфер buf.

ULONG last32=strtoul(buf+8).
buf[8]=0;
ULONG first32=strtoul(buf).

И всё...
"Не следуй за большинством на зло, и не решай тяжбы, отступая по большинству от правды" (Исх. 23:2)  
BG Реконструктор #03.12.2003 18:00
+
-
edit
 
Настройки:
INPUT - собственно файл
CRLF_SIZE - размер стринга окончания строки. Это обычно либо только 0x13, либо 0x13 + 0x10. Может быть любое число.
STR_SIZE - размер стринга для преобразования. Может работать с любым числом, которое выполняет условие n%2=0 (забыл, блин, как эти числа называются, "парные", что ли? )
 
BG Реконструктор #03.12.2003 18:02
+
-
edit
 
Vale, 03.12.2003 16:57:08:
Лишнего много.
Вообще самый компактный вариант -

считать строку(16+1 байт) в буфер buf.

ULONG last32=strtoul(buf+8).
buf[8]=0;
ULONG first32=strtoul(buf).

И всё...
 

У меня универсальный вариант. Работает с любыми настройками.
 

Vale

Сальсолёт

Что делает юзверь если нужно посчитать 2346*2234.
За полминуты умножает на бумажке.

Что делает программер?
Три дня пишет программу, перемножающую числа любой длины. Вводит данные, получает результат за 0.0000001 сек. И страшно этим гордится.


Чур, не обижаться...
"Не следуй за большинством на зло, и не решай тяжбы, отступая по большинству от правды" (Исх. 23:2)  
BG Реконструктор #03.12.2003 18:08
+
-
edit
 
Vale, 03.12.2003 17:06:11:
Что делает юзверь если нужно посчитать 2346*2234.
За полминуты умножает на бумажке.

Что делает программер?
Три дня пишет программу, перемножающую числа любой длины. Вводит данные, получает результат за 0.0000001 сек. И страшно этим гордится.


Чур, не обижаться...
 

Важно, чтоб работало...
 
+
-
edit
 

Mishka

модератор
★★★
code text
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main( int argc, char* argv[ ] )
  5. {
  6.         FILE* f;
  7.         unsigned char s1[ 10 ], s2[ 10 ];
  8.         unsigned int i1, i2;
  9.         s1[ 9 ] = s2[ 9 ] = '\0';
  10.  
  11.         f = fopen( "t03.txt", "r" );
  12.         if ( f == NULL ) return 1;
  13.  
  14.         while ( !feof( f ) )
  15.         {
  16.                 fscanf( f, "%8s%8s\n", s1, s2 );
  17.                 i1 = strtoul( s1, NULL, 16 );
  18.                 i2 = strtoul( s2, NULL, 16 );
  19.                 printf( "s1=<%s>, s2=<%s>, i1=%u(%X), i2=%u(%X)\n",
  20.                         s1, s2, i1, i1, i2, i2 );
  21.         }
  22.  
  23.         fclose( f );
  24.  
  25.         f = fopen( "t03.txt", "r" );
  26.         if ( f == NULL ) return 1;
  27.  
  28.         while ( !feof( f ) )
  29.         {
  30.                 fscanf( f, "%8X%8X\n", &i1, &i2 );
  31.                 printf( "i1=%u(%X), i2=%u(%X)\n",
  32.                         i1, i1, i2, i2 );
  33.         }
  34.  
  35.         fclose( f );
  36.  
  37.         return 0;
  38. }


А последний вообще без копирования
 
+
-
edit
 

Mishka

модератор
★★★
Vale, 03.12.2003 18:06:11:
Что делает юзверь если нужно посчитать 2346*2234.
За полминуты умножает на бумажке.

Что делает программер?
Три дня пишет программу, перемножающую числа любой длины. Вводит данные, получает результат за 0.0000001 сек. И страшно этим гордится.


Чур, не обижаться...
 

А еще через год юзверь все продолжает умножать на бумажке числа и все никак не может закончить расчеты последней задачи. Программист же уже все посчитал, успел позагорать на золотых песках, поиграть в ... (нужное подставить), попить пива и сделать еще кучу вещей.
 
RU Alesandro #03.12.2003 18:51
+
-
edit
 

Alesandro
Серокой

координатор
★★★★
Vale, 03.12.2003 17:57:08:
buf[8]=0;
 

У меня VxWorks не позволяет так играться со строкой как с массивом почему-то - не работает...
Больше не раскалятся ваши колосники. Мамонты пятилеток сбили свои клыки. ©  
BG Реконструктор #03.12.2003 19:08
+
-
edit
 
Alesandro, 03.12.2003 17:51:16:
У меня VxWorks не позволяет так играться со строкой как с массивом почему-то - не работает...
 

Я в шоке. :blink:
У тебя, очевидно, там что-то не так.
 
+
-
edit
 

Mishka

модератор
★★★
Alesandro, 03.12.2003 18:51:16:
У меня VxWorks не позволяет так играться со строкой как с массивом почему-то - не работает...
 

А пробовал так *( buf + 8 ) = '\0';
Или buf[8]='\0';

Можешь привести сообщение об ошибке?

А чем тебя не устраивает второй мой цикл - одно чтение и все готово?
 
RU Alesandro #03.12.2003 19:16
+
-
edit
 

Alesandro
Серокой

координатор
★★★★
А сообщения об ошибке нет... просто неправильно работает ...
Больше не раскалятся ваши колосники. Мамонты пятилеток сбили свои клыки. ©  
+
-
edit
 
Так где ошибка?
Нужно еще учесть конверсию по умолчанию.
Числа начинающиеся с 0 - восьмеричные, с 0х -шестьнадцатиричные, остальные десятичные... С этим не может быть проблем?
 
RU Alesandro #03.12.2003 19:26
+
-
edit
 

Alesandro
Серокой

координатор
★★★★
Mishka, Vale, извините, это моя ошибка была, работает корректно!
Больше не раскалятся ваши колосники. Мамонты пятилеток сбили свои клыки. ©  
+
-
edit
 

Mishka

модератор
★★★
А чем fscanf( f, "%8X%8X\n", &i1, &i2 ); не нравиться? Вроде еще короче. :rolleyes:
 

Vale

Сальсолёт

Вариант, что предложил Mishka, конечно, самый лучший...
"Не следуй за большинством на зло, и не решай тяжбы, отступая по большинству от правды" (Исх. 23:2)  
+
-
edit
 

Balancer

администратор
★★★★★

Alesandro, 03.12.2003 18:25:26:
fscanf(file1,"%s\n",indata);
 

Эх, когда ж её совсем запретят-то??

Perl (прямо с командной строки):
perl -ne "chomp; /(\w{8})(\w{8})/; my $hi=unpack('N*', pack('H8',$1)); my $lo=unpack('N*', pack('H8',$2)); print \"$hi:$lo\n\";"
in.txt - твои цифры
вывод:

1007321088:894042624
873005226:2705915907
0:0
1007206391:873005104
2701721603:0
0:0
2433351683:0
0:1107296288
 

Vale

Сальсолёт

Всем оно хорошо, кроме того, что - "а есть ли Perl для VxWorks?"
"Не следуй за большинством на зло, и не решай тяжбы, отступая по большинству от правды" (Исх. 23:2)  
+
-
edit
 

Balancer

администратор
★★★★★

Vale, 03.12.2003 20:39:17:
Всем оно хорошо, кроме того, что - "а есть ли Perl для VxWorks?"
 

Блин, дурдом...
http://www.cpan.org/ports/

Даже под DOS и Амигу есть А вот:
No known ports for [Inferno] [OS1100] [PalmOS] [PRIMOS] [VxWorks]



Кстати. Хм. Врут. Видел я Perl для Palm! Так что, м.б., и под VxWorks есть
 
+
-
edit
 

Mishka

модератор
★★★
 
SuSE 8.2, bash, command line:
evssuse8.2>echo -e '#include

i1=1007321088(3C0A8000),i2=894042624(354A0200)
i1=873005226(340900AA),i2=2705915907(A1490003)
i1=0(0),i2=0(0)
i1=1007206391(3C08BFF7),i2=873005104(34090030)
i1=2701721603(A1090003),i2=0(0)
i1=0(0),i2=0(0)
i1=2433351683(910A0003),i2=0(0)
i1=0(0),i2=1107296288(42000020)
evssuse8.2>

 
 
+
-
edit
 

Balancer

администратор
★★★★★

Mishka, 03.12.2003 23:47:02:
 
 

А под виндой? А в MSVC7?

Мой вариант платформеннонезависим

Кроме того, я мусорных файлов не размножаю и переполнения буфера не схвачу
 
+
-
edit
 

Mishka

модератор
★★★
Balancer, 04.12.2003 00:01:57:
А под виндой? А в MSVC7?

Мой вариант платформеннонезависим

Кроме того, я мусорных файлов не размножаю и переполнения буфера не схвачу
 

И под виндой - всяких шелов навалом.

А почему в MSVC? Как насчет 3Сом Перла под Виндой - ты можешь там это выполнить? Что 3Сом Перла нету? А ГСС и под виндой есть. Так что твой вариант платформо независимый с точностью до переноса Перла.

Кстати, покажи мне, где у меня там переполнение буфера будет?
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru