• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Запись и чтение из файла

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

Нужно записать в файл массив из целых чисел. Потом считывать по одному числу. У меня ничего не выводится и ошибка в том, что примененные функции не работают с целыми числами. Что делать?
Код:
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();
 
E

European

Может так попробуй:
Код:
out.write( (char *) A, sizeof( A ) );
А вместо getline воспользуйся read
 
G

Guest

Я написала:
Код:
for (int i=0; i<n; i++)
out<<A[i]<<' ';
и заменила на read, но выводится такая фигня:
55 12 87 7╠╠7
6 98 24 84╠╠7
27 0 0 84╠╠7
 
G

Guest

Код:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include "windows.h"

using namespace std;
const int n=10;

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[n]={55, 12, 87, 76, 98, 24, 84, 27};
char buf[n];
//	out.write((char *)A,sizeof(A));
for (int i=0; i<n; i++)
out<<A[i]<<' ';
out.close();
ifstream in("test");
if (!in){
cout<<chtooem("ошибка открытия файла\n");
return 1;
}
/*	for (i=0; i<n; i++)
in>>A[i]>>' ';*/
while (!in.eof()){
in.read(buf,n);
cout<<buf<<endl;
}
in.close();
return 0;
}
 
E

European

Ошибка в твоем коде заключалась в том, что ты пыталась в цикле читать не по одному элементу, а по 10 байт. Вот рабочий код:
Код:
int main(int argc, char* argv[])
{
int A[] = { 55, 12, 87, 76, 98, 24, 84, 27 };
char* szFileName = "test.dat";

ofstream out( szFileName, ios::binary );
if( !out )
{
cout << chtooem("ошибка открытия файла") << endl;
return 1;
}
out.write( (char*)A, sizeof(A) );
out.close();

ifstream in( szFileName, ios::binary );
if( !in )
{
cout << chtooem("ошибка открытия файла") << endl;
return 1;
}

while( in || !in.fail() )
{
int val;
if( in.read( (char*)&val, sizeof(val) ) )
cout << val << " ";
} 
cout << endl;
in.close();

return 0;
}
 
G

Guest

Теперь в конце выводится еще 2 лишних элемента равные нулю.
 
E

European

Эх, ну хоть немного подумать можно? У тебя определена константа
Код:
const int n=10;
отвечающая за количество элементов в массиве, а на самом деле элементов только 8! Вот отсюда и 2 лишних элемента. Заметь, у меня эта константа не используется... Внимательнее надо быть
 
G

Guest

Я переделала немного свой код:
Код:
#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.
?
 
E

European

Все очень просто... Перед тем как выводить считанное значение необходимо проверить, успешно ли завершилась операция чтения. Например так:
Код:
if( in>>val ) cout << val << " ";
 
G

Guest

А если допустим мне нужно считать числа из файла А через один и записывать их в отдельные файлы, т.е. числа, стоящие на четных местах, записываются в файл В, на нечетных - в С. Тогда как?
 
E

European

Введи в цикл индекс итерации и проверяй его на четность путем проверки остатка от деления (%)
 
G

Guest

Да нет, я думаю, нужно каким-то образом вставить цикл for с шагом 2.
 
G

Guest

Смотрите мой код. Теперь мне нужно считывать из А по два числа. Первые 2 записать в В, вторые 2 - в С и т.д. Потом мне нужно будет считывать и записывать по четверкам. Как сделать?
Код:
#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 outa("A"), outb("B"), outc("C");
if (!outa && !outb && !outc){
cout<<chtooem("Ошибка открытия файла для записи\n");
return 1;
}	
int A[]={55, 12, 87, 76, 98, 24, 84, 27};
for (int i=0; i<n; i++)
outa << A[i] << " "; 
outa.close();
ifstream ina("A"), inb("B"), inc("C");
if (!ina){
cout<<chtooem("Ошибка открытия файла для чтения\n");
return 1;
}
int j=0;
while( ina || !ina.fail())
{
int val;
for (i=0; i<n; i++){
if (i%2==0){		
if (ina>>val)
outb << val << " ";
}
else{
if (ina>>val)
outc << val << " ";
}
}
}
ofstream outa2("A");
cout<<endl;
outb.close();
outc.close();
ina.close();
while (!inc.fail() && !inb.fail())
{
int val1, val2;
if (inb>>val1 && inc>>val2)
if (val1<val2){
outa2<<val1<<" ";
outa2<<val2<< " ";
}
else{
outa2<<val2<<" ";
outa2<<val1<<" ";
}
}
outa2.close();
inb.close();
inc.close();
return 0;
}
 
E

European

1 - сделать цикл до sizeof(A)/N, где N - количество цифр в считываемой группе, т.е. 2, 4 и т.д
2 - в каждой итерации считывать группу и по индексу цикла проверять в какой поток необходимо записывать
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!