Форум программистов, компьютерный форум CyberForum.ru

Запись в файл через _write, откуда берется размер? - C++

Восстановить пароль Регистрация
 
KokosSPb
32 / 82 / 3
Регистрация: 03.02.2011
Сообщений: 463
01.04.2013, 13:08     Запись в файл через _write, откуда берется размер? #1
Народ, решил создать отдельную тему, нигде не нашел, по моему мнению -это вообще бред, но он есть 0_о
Тема следующая, есть двумерный массив или массив структур, мы заполняем его синусом и записываем в файл через _write.
При последней проверке пришли к следующему коду (с максимальными комментариями):
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
typedef struct{
    float x1,y1,x2,y2,x3,y3,x4,y4;
} coordS;
             coordS co[64];
             static float is=5.7;
             for(int id=0;id<64;id++){
                 co[id].x1=sin(is);
                 co[id].x2=sin(is);
                 co[id].x3=sin(is);
                 co[id].x4=sin(is);
                 co[id].y1=sin(is);
                 co[id].y2=sin(is);
                 co[id].y3=sin(is);
                 co[id].y4=sin(is);
                 is+=0.1;
             }
             char cc[128],name[25];//Объявляем переменные имени и названия баз
             float coord[64][2];
             String^ nameT;// Объявляем строковую переменную имени
             nameT = "4_.Test"+"_.par";//Называем переменную имени файла
             int ic;//Переменная номера символа
             for(ic=0;ic<nameT->Length;ic++){
                 cc[ic]=nameT[ic];//Применение названия файла в массив
             }
             cc[ic] = 0;//Конец ввода
             static int fh = 0;//Объявляем дескритор файла
             int hf = _sopen_s(&fh,cc,_O_CREAT|_O_RDWR|_O_APPEND,_SH_DENYNO,_S_IREAD|_S_IWRITE);//Открываем файл и записываем егов  дискриптор
             int hw = _write(fh,co,sizeof(co));//Записываем значение в файл
             _close(fh);//Закрываем файл
Файл должен быть размером sizeof(float)*8*64=4*8*64=2048 Байт
Если is=5.8, файл равен 2048 байт, а если is=5.7 тогда файл равен 2056 байт, почему?

Не по теме:

хорошая тема? :-)



Добавлено через 7 минут
Хотя hw всегда равен 2048
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
01.04.2013, 20:01     Запись в файл через _write, откуда берется размер? #2
Внимательно посмотрите на рисунок.
Запись в файл через _write, откуда берется размер?

Это HEX при is=5.7. Зелёным выделены нормальные 4-х байтовые блоки. Но вот есть одна партия (8 блоков отмеченные красным) не по 4, а по 5 байт. А теперь внимательно посмотрите на то, что выделено розовым цветом. Ничего не напоминает? Я думаю вы догадались в чём дело? Решение проблемы ниже

Кликните здесь для просмотра всего текста
Откройте файл в бинарном режиме. 0xD0 0x0A это виндовый переход на следующую строку. Когда вы транслировали свой вектор данных в файл открытом в текстовом режиме, то код символа '\n' был заменён на 0xD0 0x0A
KokosSPb
32 / 82 / 3
Регистрация: 03.02.2011
Сообщений: 463
02.04.2013, 08:19  [ТС]     Запись в файл через _write, откуда берется размер? #3
Цитата Сообщение от anmartex Посмотреть сообщение
Когда вы транслировали свой вектор данных в файл открытом в текстовом режиме, то код символа '\n' был заменён на 0xD0 0x0A
как мне открыть файл не в текстовом режиме? И вообще, откуда это береться? у меня нет перехода на следующую строчку код же выше представлен
fjay69
 Аватар для fjay69
85 / 85 / 1
Регистрация: 26.10.2012
Сообщений: 248
02.04.2013, 08:42     Запись в файл через _write, откуда берется размер? #4
C++
1
2
3
4
FILE* fh;//Объявляем указатель на файл
fh = fopen(cc,"w");//открываем файл для записи
fwrite(co,sizeof(co),1,fh);//запись
fclose(fh);//закрываем файл
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
02.04.2013, 08:54     Запись в файл через _write, откуда берется размер? #5
Цитата Сообщение от KokosSPb Посмотреть сообщение
у меня нет перехода на следующую строчку код же выше представлен
Хм... Вы ничего не поняли. Ладно, просто поставьте дополнительный флаг _O_BINARY при открытии файла, и будет вам счастье.
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
02.04.2013, 09:01     Запись в файл через _write, откуда берется размер? #6
fjay69, на те же грабли наступаете:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
int main()
{
   char data[] = "\n";
 
   FILE* f = fopen("test.bin", "w");
 
   if (f)
   {
      fwrite(data, 1, 1, f);
      fclose(f);
   }
 
   return 0;
};
то получаем:

Запись в файл через _write, откуда берется размер?

А если fopen("test.bin", "wb"), то:

Запись в файл через _write, откуда берется размер?
KokosSPb
32 / 82 / 3
Регистрация: 03.02.2011
Сообщений: 463
02.04.2013, 09:24  [ТС]     Запись в файл через _write, откуда берется размер? #7
Цитата Сообщение от anmartex Посмотреть сообщение
Хм... Вы ничего не поняли.
Ну, я так понял, что из-за того, что я использую
C++
1
_sopen_s(&fh,cc,_O_CREAT|_O_RDWR|_O_APPEND,_SH_DENYNO,_S_IREAD|_S_IWRITE);
прога открывает его только в текстовом режиме, и винда сама добавляет (по непонятной причине) \n, верно?
я просто не понимаю почему

Хотелось бы разобраться в этом вопросе
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2013, 09:33     Запись в файл через _write, откуда берется размер?
Еще ссылки по теме:

Переделать запись в файл информации о студенте через структуру C++
Объясните, откуда берется время C++
Запись в файл через fwrite C++

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

Или воспользуйтесь поиском по форуму:
anmartex
...
 Аватар для anmartex
1700 / 1193 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
02.04.2013, 09:33     Запись в файл через _write, откуда берется размер? #8
Цитата Сообщение от KokosSPb Посмотреть сообщение
Хотелось бы разобраться в этом вопросе
Это хорошо, что пытаетесь Ладно, теперь по порядку. Так получилось, что у вас синус стал равен, к примеру, 0.85459959507, т.е. в hex он будет выглядеть так: 0x0AC75A3F, ну а если по отдельности: 0x0A 0xC7 0x5A 0x3F. 0x0A в ASCII это символ перехода на следующую строку. Так вот при записи данных в текстовом режиме 0x0A будет заменяться на 0xD00A. Т.е. получаем 1 лишний байт, а т.к. у вас таких значений 8, то и получаем 8 лишних байт.
Yandex
Объявления
02.04.2013, 09:33     Запись в файл через _write, откуда берется размер?
Ответ Создать тему
Опции темы

Текущее время: 15:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru