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


Автор: icepro 12.3.2009, 01:18
Код

#include <afx.h>
#include <iostream>

using namespace std;

void main()
{
    CFile File;
    char * FileName = "file.txt";

    if (!File.Open(FileName,CFile::modeWrite,NULL)) { return; }
    char Buffer[100];
    cin >> Buffer;
    File.Write(&Buffer,sizeof(Buffer));
    File.Close();

    if (!File.Open(FileName,CFile::modeRead,NULL)) { return; }
    int Pos;
    cout << "Input position of the symbol to read: " << endl;
    cin >> Pos;
    char RBuffer[2];
    File.Seek(Pos,CFile::begin);
    File.Read(&RBuffer,sizeof(RBuffer));
    cout << endl << RBuffer;
    File.Close();

    cin.get();
    cin.get();
}


есть консольный проект с текстом что выше. после того как ввел данные они записываются в файл, но он до конца (если не все 100 символов забиты) добивается мусором, но то не столь важно, хотя если важно то поясните в чем трабла... но важнее то что в этой ситуации когда я читаю из файла то в принципе все ок, кроме того что строка состоит не из 2 символов а больше, и первых два это то что нужно а остальное мусор, всякие квадратики и т.п. что делать? как сделать нормальный вывод?

Автор: chaos 12.3.2009, 07:03
icepro, 
Код

char Buffer[100] = {0}


или

Код

::ZeroMemory(Buffer, 100);

Автор: mrbrooks 12.3.2009, 08:52
icepro, интересная братская могила. почему бы сразу не использовать файловый ввод/вывод в стиле С++?

Автор: icepro 12.3.2009, 21:30
Код

#include <afx.h>
#include <iostream>

using namespace std;

void main()
{
    CFile File;
    char * FileName = "file.txt";

    if (!File.Open(FileName,CFile::modeWrite,NULL)) { return; }
    char Buffer[100];
    ZeroMemory(Buffer, 100);
    cin >> Buffer;
    File.Write(&Buffer,sizeof(Buffer));
    File.Close();

    if (!File.Open(FileName,CFile::modeRead,NULL)) { return; }
    int Pos;
    cout << "Input position of the symbol to read: " << endl;
    cin >> Pos;
    char RBuffer[2];
    File.Seek(Pos,CFile::begin);
    File.Read(&RBuffer,sizeof(RBuffer));
    cout << endl << RBuffer;
    File.Close();

    cin.get();
    cin.get();
}


результат

user posted image

что за окончание после 56??

Автор: zim22 12.3.2009, 22:30
Цитата(icepro @  12.3.2009,  21:30 Найти цитируемый пост)
что за окончание после 56??

палочки и ромбик.

Автор: icepro 12.3.2009, 23:44
Очень смешно!! А как от этого избавиться??

Автор: Anikmar 13.3.2009, 02:15
Цитата(icepro @  12.3.2009,  21:30 Найти цитируемый пост)
char RBuffer[2];
    File.Seek(Pos,CFile::begin);
    File.Read(&RBuffer,sizeof(RBuffer));
    cout << endl << RBuffer;

Вы выделяете 2 байта под буферю
Затем считываете 2 байта
Но вы не оставляете место под завершающий 0.
Отсюда - мусор.
Попробуйте так:
    char RBuffer[3] = {0};
    File.Seek(Pos,CFile::begin);
    File.Read(&RBuffer,sizeof(RBuffer)-1);
    cout << endl << RBuffer;

Автор: WinAx 13.3.2009, 02:16
Если способ реализации несущественный, то вот тебе твоя программа smile 

Код

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

void main()
{
    char FileName[] = "file.txt";
    ofstream hFile(FileName);
    if(!hFile){return;}
    string Buffer;
    cin >> Buffer;
    hFile << Buffer;
    hFile.close();
    fstream hRFile(FileName);
    if(!hRFile){return;}
    int pos;
    cout << "Input position of the symbol to read: " << endl;
    cin >> pos;
    hRFile.seekp(pos);
    char RBuffer[3];
    hRFile.read(RBuffer, 2);
    RBuffer[2]=0;
    cout << RBuffer << endl;
    hRFile.close();
}


Если что не ясно, могу пояснить.

Автор: icepro 13.3.2009, 02:26
Способ реализации существенен.
Предпоследний вариант очень помог, спасибо!

Автор: WinAx 13.3.2009, 02:55
Цитата(icepro @  13.3.2009,  02:26 Найти цитируемый пост)
Способ реализации существенен.


А, ну да, как это я сам не догадался...  smile 

Автор: mrbrooks 13.3.2009, 09:39
WinAx,   smile 
все таки файловый ввод/вывод в стиле С++ рулит  smile 

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