Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
госик
Зарегистрирован: 10.10.2006 Сообщения: 9
|
Добавлено: Пт Ноя 17 2006 19:06 Заголовок сообщения: Запись и чтение из файла |
|
|
Нужно записать в файл массив целых чисел. А затем по одному их считывать, как это сделать? У меня ничего не выводится и ошибка, что примененные функции не для целых чисел.
Код: | ofstream out("test");
if (!out){
cout<<chtooem("Ошибка открытия файла для записи\n");
return 1;
}
int A[n]={55, 12, 87, 76, 98, 24, 84, 27};
int buf[n];
out.write(A,n);
out.close();
ifstream in("test");
if (!in){
cout<<chtooem("Ошибка открытия файла для чтения\n");
return 1;
}
while (!in.eof()){
in.getline(buf,n);
cout<<buf<<endl;
}
in.close(); |
|
|
Вернуться к началу |
|
|
Dimasm
Зарегистрирован: 25.04.2005 Сообщения: 454
|
Добавлено: Сб Ноя 18 2006 00:07 Заголовок сообщения: |
|
|
а какой именно вид файла тебе нужен?
если текстовый - то чтобы записать число, переведи его в String или Char. с текстовым форматом проще и нагляднее
если бинарный - то там по другому, там и файлы меньше и скорость чтения выше
out.write(A,n);
А - это указатель на память, где начинается твой массив
n - длинна масива в памяти...
ты считаешь, что в памяти целое число знимает 1 бит? мне кажется не меньше 8
может стоит попробовать что-то типа
out.write(A,n*sizeof(int));
нашёл у себя в архивах такой код
Код: | void __fastcall LoadBinFile(String FileName)
{
int *Data;
int Count;
TFileStream *FStream;
try{
FStream=new TFileStream(FileName,fmOpenRead );
FStream->Position = 0;
FStream->Read(&Count,sizeof(Count));
Data = new int[Count+1];
for (int i=0;i<Count;i++)
FStream->Read(&Data[i],sizeof(Data[i]));
delete FStream;
}
catch(...)
{
};
....
....
delete []Data;
return 0;
}; |
в этом бинарнике, первое Int число - это длинна файла, вернее длинна массива чисел записанных в файле _________________ С уважением Dimasm |
|
Вернуться к началу |
|
|
госик
Зарегистрирован: 10.10.2006 Сообщения: 9
|
Добавлено: Сб Ноя 25 2006 18:29 Заголовок сообщения: Запись и чтение из файла |
|
|
Я переделала немного свой код:
Код: | #include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include "windows.h"
using namespace std;
const int n=8;
string chtooem(string str)
{
char* buf=new char[str.size()+1];
CharToOem (str.c_str(),buf);
string res(buf);
delete[] buf;
return res;
}
int main(int argc, char* argv[])
{
ofstream out("test");
if (!out){
cout<<chtooem("ошибка открытия файла\n");
return 1;
}
int A[]={55, 12, 87, 76, 98, 24, 84, 27};
int buf[n];
for (int i=0; i<n; i++)
out << A[i] << " ";
out.close();
ifstream in("test");
if (!in){
cout<<chtooem("ошибка открытия файла\n");
return 1;
}
while( in || !in.fail() )
{
int val;
in>>val;
cout << val << " ";
}
cout<<endl;
in.close();
return 0;
} |
но теперь выводится такой результат:
55 12 87 76 98 24 84 27 27
т.е выводится еще одна лишняя 27.
? |
|
Вернуться к началу |
|
|
Dimasm
Зарегистрирован: 25.04.2005 Сообщения: 454
|
Добавлено: Вс Ноя 26 2006 00:01 Заголовок сообщения: |
|
|
да, недавно на такую же каку попался...
попробуй так
Код: | while( in || !in.fail() )
{
int val;
in>>val;
if(!in.fail())
cout << val << "\n";
else break;
} |
in.fail() меняется на TRUE, не когда подошёл последний блок файла, а когда попытались прочитать дальше
и мне кажется в строке
while( in || !in.fail() )
"in ||" - лишнее _________________ С уважением Dimasm |
|
Вернуться к началу |
|
|
TeAnton
Зарегистрирован: 02.06.2007 Сообщения: 7
|
Добавлено: Сб Июн 02 2007 01:40 Заголовок сообщения: |
|
|
нужен не in.fail(), а in.eof(), imho. |
|
Вернуться к началу |
|
|
|