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

Тема в разделе "MS Visual C++", создана пользователем -, 17 ноя 2006.

Статус темы:
Закрыта.
  1. Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Может так попробуй:
    Код (Text):
    out.write( (char *) A, sizeof( A ) );
    А вместо getline воспользуйся read
     
  3. Гость

    Я написала:
    Код (Text):
    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
     
  4. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Покажи весь код
     
  5. Гость

    Код (Text):
    #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;
    }
     
  6. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Ошибка в твоем коде заключалась в том, что ты пыталась в цикле читать не по одному элементу, а по 10 байт. Вот рабочий код:
    Код (Text):
    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;
    }
     
  7. Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Эх, ну хоть немного подумать можно? У тебя определена константа
    Код (Text):
    const int n=10;
    отвечающая за количество элементов в массиве, а на самом деле элементов только 8! Вот отсюда и 2 лишних элемента. Заметь, у меня эта константа не используется... Внимательнее надо быть
     
  9. Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Все очень просто... Перед тем как выводить считанное значение необходимо проверить, успешно ли завершилась операция чтения. Например так:
    Код (Text):
    if( in>>val ) cout << val << " ";
     
  11. Гость

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Введи в цикл индекс итерации и проверяй его на четность путем проверки остатка от деления (%)
     
  13. Гость

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

    Смотрите мой код. Теперь мне нужно считывать из А по два числа. Первые 2 записать в В, вторые 2 - в С и т.д. Потом мне нужно будет считывать и записывать по четверкам. Как сделать?
    Код (Text):
    #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;
    }
     
  15. European

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

Поделиться этой страницей