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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
#1

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

01.04.2013, 13:08. Просмотров 490. Ответов 7
Метки нет (Все метки)

Народ, решил создать отдельную тему, нигде не нашел, по моему мнению -это вообще бред, но он есть 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
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2013, 13:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запись в файл через _write, откуда берется размер? (C++):

Объясните, откуда берется время - C++
Собрал пример, запустил, рисует время. Посмотрел в код, не нашел, каким образом он это время рисует и откуда он его берет. Объясните...

Откуда берется 11 значение массива если const = 10? - C++
Подскажите обоснование, откуда берется одиннадцатый нуль, если задано постоянное значение массива из 10 элементов? #include &lt;iostream&gt; ...

Откуда берется мусор при создании массива типа char? - C++
Добрался до темы книги &quot;потоки и файлы&quot;. Решил написать небольшую программу генератора кода. В общем код пишут, но в конце еще...

Откуда берется значение указателя после удаления памяти на которую он ссылается? - C++
Всем привет. Почему при удалении памяти указатель еще работает? Пример программы: #include &lt;iostream&gt; #include &lt;stdio.h&gt; ...

запись в файл, не изменяя размер самого файла - C++
int stream::write(block blocks, int numOfBlocks,const char *data){ int filesize=strlen(data); ofstream disk(&quot;data.dat&quot;,ios::out...

Запись в файл через fwrite - C++
Хочу записать число типа int в файл. Открываю файл и вижу символы, чисел нет ... #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
anmartex
...
1706 / 1199 / 496
Регистрация: 12.02.2013
Сообщений: 1,978
01.04.2013, 20:01 #2
Внимательно посмотрите на рисунок.
Запись в файл через _write, откуда берется размер?

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

Кликните здесь для просмотра всего текста
Откройте файл в бинарном режиме. 0xD0 0x0A это виндовый переход на следующую строку. Когда вы транслировали свой вектор данных в файл открытом в текстовом режиме, то код символа '\n' был заменён на 0xD0 0x0A
1
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
02.04.2013, 08:19  [ТС] #3
Цитата Сообщение от anmartex Посмотреть сообщение
Когда вы транслировали свой вектор данных в файл открытом в текстовом режиме, то код символа '\n' был заменён на 0xD0 0x0A
как мне открыть файл не в текстовом режиме? И вообще, откуда это береться? у меня нет перехода на следующую строчку код же выше представлен
0
fjay69
85 / 85 / 1
Регистрация: 26.10.2012
Сообщений: 248
02.04.2013, 08:42 #4
C++
1
2
3
4
FILE* fh;//Объявляем указатель на файл
fh = fopen(cc,"w");//открываем файл для записи
fwrite(co,sizeof(co),1,fh);//запись
fclose(fh);//закрываем файл
0
anmartex
...
1706 / 1199 / 496
Регистрация: 12.02.2013
Сообщений: 1,978
02.04.2013, 08:54 #5
Цитата Сообщение от KokosSPb Посмотреть сообщение
у меня нет перехода на следующую строчку код же выше представлен
Хм... Вы ничего не поняли. Ладно, просто поставьте дополнительный флаг _O_BINARY при открытии файла, и будет вам счастье.
1
anmartex
...
1706 / 1199 / 496
Регистрация: 12.02.2013
Сообщений: 1,978
02.04.2013, 09:01 #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, откуда берется размер?
2
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
02.04.2013, 09:24  [ТС] #7
Цитата Сообщение от anmartex Посмотреть сообщение
Хм... Вы ничего не поняли.
Ну, я так понял, что из-за того, что я использую
C++
1
_sopen_s(&fh,cc,_O_CREAT|_O_RDWR|_O_APPEND,_SH_DENYNO,_S_IREAD|_S_IWRITE);
прога открывает его только в текстовом режиме, и винда сама добавляет (по непонятной причине) \n, верно?
я просто не понимаю почему

Хотелось бы разобраться в этом вопросе
0
anmartex
...
1706 / 1199 / 496
Регистрация: 12.02.2013
Сообщений: 1,978
02.04.2013, 09:33 #8
Цитата Сообщение от KokosSPb Посмотреть сообщение
Хотелось бы разобраться в этом вопросе
Это хорошо, что пытаетесь Ладно, теперь по порядку. Так получилось, что у вас синус стал равен, к примеру, 0.85459959507, т.е. в hex он будет выглядеть так: 0x0AC75A3F, ну а если по отдельности: 0x0A 0xC7 0x5A 0x3F. 0x0A в ASCII это символ перехода на следующую строку. Так вот при записи данных в текстовом режиме 0x0A будет заменяться на 0xD00A. Т.е. получаем 1 лишний байт, а т.к. у вас таких значений 8, то и получаем 8 лишних байт.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2013, 09:33
Привет! Вот еще темы с ответами:

Запись в файл через потоки - C++
fstream file; ... cout&lt;&lt;&quot;Введите - имя файла.dat:&quot;&lt;&lt;endl; cin&gt;&gt;fname; file.open(fname,...

Ошибки при запись в файл через fwrite - C++
FILE*f = fopen(&quot;book.txt&quot;, &quot;wb&quot;); fwrite(&quot;s&quot; , sizeof(char),1, f); int notesize = note.size(); fwrite(&amp;notesize, ...

Запись, чтение объектов в файл через указатели. - C++
не могу прочитать объекты из файла. Сломал голову. Все перепробовал. Препод отправил гуглить))). Писать что то вроде пишет? Но что? А...

Переделать запись в файл информации о студенте через структуру - C++
Помогите пожалуйста немного отредактировать код. Преподаватель просит сделать с помощью структуры. Вот, что требуется: &quot;Используй...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.04.2013, 09:33
Ответ Создать тему
Опции темы

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