Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Запись в файл


Автор: ferum 17.4.2006, 17:40
Приве всем.
Я хочу записать в файл число типа float.
(массивы через структуры мне не надо, т.к это поэлементное считывание)
а у меня в файле будет тысячи чисел.
Строку занести в файл тоже могу, а вот числа никак не получается.
Подскажите как это осуществить? 

Автор: _hunter 17.4.2006, 18:03
так а в чем проблема?
пишем 
WriteFile(hFile, (char*)number, sizeof(double), &numberOfBytesWritten, NULL);
и все... 

Автор: ferum 17.4.2006, 18:43
А можно  на конкретном примере?
float number=50;
DWORD numberOfBytesWritten;
 

Автор: _hunter 17.4.2006, 18:49
дык:
Код

float number = 50;
DWORD numberOfBytesWritten = 0;
WriteFile(hFile, (char*)number, sizeof(number), &numberOfBytesWritten, NULL);


в чем проблема-то? 

Автор: Doc_d0s 17.4.2006, 19:15

(char*)number

а как он флоат к строке приведет? не особо понятен механизм:?
может лучше взять функцию из серии Atof? 

Автор: ferum 17.4.2006, 19:41
[_hunter]

На строке
WriteFile(hFile, (char*)number, sizeof(number), &numberOfBytesWritten, NULL);

пишет ошибку
Incompatible type conversion


Если использовать atof 
(такая же ошибка: )
 

Автор: SergeCpp 17.4.2006, 20:56
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/writefile.asp(hFile, (void*)&number, sizeof(number), &numberOfBytesWritten, NULL);

// можно и char* оставить... если компилер не заругается...   

Автор: ferum 17.4.2006, 21:20
  SergeCpp   
Компилит нормально только в файл какую-то лабуду скидывает.
У меня такое же было (массивы через структуры, 
там поэлементное считывание)
А можно ли считать весь файл?
 

Автор: ferum 18.4.2006, 00:00
Нашёл ответ (на VINGRADe)

Код
  
double val = 1234.56;//что записываем
char *buf;// куда записываем
int digits = 6;//кол-во цифр, которые будут записаны
gcvt(val, digits, buf);  
  

Тему можно закрывать 

Автор: Earnest 18.4.2006, 08:29
Так бы сразу и сказал, что тебе в текстовом виде надо... Функций преобразования числа в строку - тьма. Начиная от найденного тобою gcvt до sprintf... 

Автор: ferum 18.4.2006, 13:01
У меня возник вопрос
А как записать значение (число) на
следующую строку В ФАЙЛЕ
(на вторую) а так всё записывает на первую.(  for   не помогает) 

Автор: _hunter 18.4.2006, 13:10
пиши после числа 0х0D0A 

Автор: ferum 18.4.2006, 13:53
А можно по-конкретнее(после какого числа)

Код
 
float val=1234.56;//что записываем
char *buf;// куда записываем
int digits =6;//кол-во цифр, которые будут записаны
int i;
DWORD numberOfBytesWritten; 

for (i=1;i<=5;i++)
{
   gcvt(val, digits, buf);
   WriteFile(hFile,buf,7,&numberOfBytesWritten, NULL);
}
  

Автор: _hunter 18.4.2006, 14:09
после 
WriteFile(hFile,buf,7,&numberOfBytesWritten, NULL);
напиши
WriteFile(hFile, "\r\n", 2, &numberOfBytesWritten, NULL);
( или наоборот ) 

Автор: ferum 18.4.2006, 14:52
 hunter  спасибо
На другой проге пошло, на этой не хочет.(странно)
У меня вот возник вопрос по этой теме
А можно ли считать с файла весь текст (а не каждый элемент по отдельности). Инфы на эту тему у меня слишком мало.
 

Автор: _hunter 18.4.2006, 15:28
можно. ReadFile в соотв. буффер.
непонятно какая инфа ( кроме той, что есть в MSDN тебе нужна ) 

Автор: ferum 18.4.2006, 16:33
hunter  тебе:
У меня вопрос по предыдущей теме
Прога идёт!
Код
 
char str[]="Hello\0";
DWORD number; 
   WriteFile(hFile,str,sizeof(str),&number,NULL);
   WriteFile(hFile,"\r\n", 2, &number, NULL); 

А эта нет
Код
 
char *buf;// куда записываем
float val=1234.56;//что записываем
int digits =6;//кол-во цифр, которые будут записаны
DWORD number;

   gcvt(val, digits, buf);
   WriteFile(hFile,buf,7,&number, NULL);
   WriteFile(hFile,"\r\n",2,&number, NULL); 

Error: в строке WriteFile(hFile,"\r\n",2,&number, NULL); 

Если убрать в обоих прогах WriteFile(hFile,"\r\n",2,&number, NULL); 
то идут обе.

Инфв
В inete встречается и на русском с подробным описанием 

Автор: _hunter 18.4.2006, 16:40
во-первых: что значит "не идет" и что значит "Error"
во-вторых: а память под buf кто выделять будет? 

Автор: ferum 18.4.2006, 17:40
hunter ты прав  

память выделил (или распределил)  

Автор: ferum 18.4.2006, 19:02
Как узнать размер файла ?
(может есть какая функция)

  

Автор: _hunter 19.4.2006, 13:57
есть.
называется она ( как ни странно ) GetFileSize 

Автор: ferum 19.4.2006, 14:22
 hunter:  спасибо
я уже узнал smile
у меня вот с этой function возник вопрос
Как выделить память для size
DWORD size=GetFileSize (hFile, NULL);

 

Автор: _hunter 19.4.2006, 14:39
примерно так:
char* buffer = new char[size]; 

Автор: ferum 19.4.2006, 14:57
Не получается

Кусочек проги
Код
 
number=0;
DWORD size=GetFileSize (hFile, NULL);
char* buffer = new char[size];
ReadFile (hFile,(void*)buffer,size, &number, NULL); 
   

Автор: _hunter 19.4.2006, 15:37
что не получается? 

Автор: ferum 19.4.2006, 16:14
походу не может выделить память под size
на 3-ей строке происходит стопор. 

Автор: _hunter 19.4.2006, 16:30
что значит "не может"?
что значит "происходит стопор"? ( причем на третьей строке ты размер файла определяеш )
учись правильно задавать вопросы -- чтобы информацию из тебя побитно вытаскивать не приходилось... 

Автор: ferum 19.4.2006, 16:53
Вот такая вот непоняточка
Прога большая память уже загружена на другие переменные и на size
памяти не хватило (и надо её распределить для size).
Вот я думаю как распределить память с помощью (calloc,malloc)

В size память не выделяется, 
поэтому в size не записывается размер файла
Соответственно в переменную buffer ничего не записывается.

 

Автор: _hunter 19.4.2006, 17:03
шутки шутим? 4-х байт на стеке не хватило? еще и безо всяких сообщений об этом?..
явно с хендлом файла накосячил... 

Автор: ferum 19.4.2006, 17:22
С хЭндлом не мог. 
Он у меня используется только один раз при создании файла. 

Автор: _hunter 19.4.2006, 17:32
дык невыделение памяти под DWORD тоже произойти не могло... 

Автор: ferum 19.4.2006, 19:08
объявил DWORD size, как глобальную переменную
опять с памятью проблемка. (да уж)
 

Автор: _hunter 20.4.2006, 10:31
еще раз говорю -- нет там никакой проблемы с памятью
в чем она, кстати, выражается? 

Автор: ferum 20.4.2006, 14:46
С памятью проблема исчезла
Возникла новая тупо с выводом результата

Код
 
//Глобальные переменные
DWORD number;
DWORD size;
char szT[10000];
char *buff;
// эта частичка в WinMain
 number=0;
// хЭндл выше при создании файла
   hFile=CreateFile("winfile.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
   size = GetFileSize (hFile, NULL);
   buff=(char*) calloc(10000, sizeof(char));                         //add
   ReadFile (hFile, buff,size, &number, NULL);

   wsprintf(szT,"%s",buff);
   MessageBox(NULL,szT,"Info",MB_OK);
   free(buff);
   CloseHandle(hFile);  


Выводит результат => 0 (в MessageBox)
А должно в цикле от 0 до 10 
типо
1.32432       5.4552 ... 5.4552 
1.32432       5.4552 ... 5.4552 
....
1.32432       5.4552 ... 5.4552 

заносит в файл всё как надо (я заносил через gcvt), 
но не считывает.
Мож и обратно надо конвертить
хотя с малыми прогами
всё записывалось 
и считывалось без обратной конвертации .   

Автор: _hunter 20.4.2006, 14:53
не понял ни что выводит ни что должно быть.
кстати, а не проще ли сразу buff выводить? зачем пляски с wsprintf? 

Автор: ferum 20.4.2006, 15:10
Да точно нафмга эти пляски smile)
Но всё равно результат 0

Мож обратно конвертить, на всякий случай (через atof чтоли).
Я могу всю прогу написать? а?

Только первый символ файла выводит (smile
  

Автор: ferum 21.4.2006, 14:13
Вобщем разобрался 
Функтион gcvt не записывает в файл десятичную точку,
у таких чисел как 1, 2 типа int она вместо точки ставит пробел
1 00 . И при считывании считывается всё до недопустимого знака то бишь пробела. 
Вот и недостатки конвертирования налицо_:(
 

Автор: ferum 21.4.2006, 22:23
Всё разобрался 
ТЕМА ЗАКРЫТА  

Автор: Nemesis 24.4.2006, 19:31
блин, как стереть сообщение? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)