Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Я в этом не шарю
3 / 3 / 3
Регистрация: 03.09.2014
Сообщений: 191
1

Fstream пишет 13 вместо 10

04.10.2014, 16:13. Показов 1308. Ответов 4
Метки нет (Все метки)

столкнулся с весьма необычной проблемой.
открываю файл для записи
C++
1
if (!Open(filename, 1))return false;
C++
1
2
3
4
5
6
7
8
9
10
bool FILE::Open(str filename, int mode)
{
    switch(mode)
    {
        case 0:     file.open(filename,std::fstream::in);break;
        case 1:     file.open(filename,std::fstream::out);break;
        default:    file.open(filename,std::fstream::in | std::fstream::out);break;
    };
    return file.is_open();
}
пишу число 10, а на выходе в файл пишется число 13.
как такое вообще возможно?
причем если я пишу скажем 0x0a0a0a0a
на выходе будет 0x0d0a0d0a
процедура записи
C++
1
WritePos(10, 2, seek);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
int FILE::WritePos(uint data, int size, int pos)
{
    if (!IsOpen())return false;
 
    file.seekg(pos,file.beg);
    switch(size)
    {
    case 1:
        {
            if (data>0xFF)return false;
 
            char*temp = new char[size-1];
            temp[0]=data;
            file.write(temp,size);
            delete temp;
            return true;
        };break;
    case 2:
        {
            if (data>0xFFFF)return false;
 
            char*temp = new char[size-1];
            temp[0]=((data&0xFF00)>>8);
            temp[1]=(data&0xFF);
            file.write(temp,size);
            delete temp;
            return true;
        };break;
    case 4:
        {
            if (data>0xFFFFFFFF)return false;
 
            char*temp = new char[size-1];
            temp[0]=((data&0xFF000000)>>24);
            temp[1]=((data&0xFF0000)>>16);
            temp[2]=((data&0xFF00)>>8);
            temp[3]=(data&0xFF);
            file.write(temp,size);
            delete temp;
            return true;
        };break;
    }
    return false;
}
пробовал писть по байтам. все 13

Добавлено через 2 минуты
пробовал так temp[3]=(char)(data&0xFF);
не помогло

Добавлено через 1 минуту
причем если я пишу 9 или 11, все нормально.
даже если 13 пишу на выходе 13

Добавлено через 10 минут
даже так 10 превращается в 13
C++
1
file.write(reinterpret_cast<char*>(data),size);
Добавлено через 7 минут
если что вот класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class FILE
{
    std::fstream    file;
 
    bool            Open(str filename, int mode);
    bool            IsOpen();
    bool            SetPos(int pos);
    int         GetPos();
    int         GetSize();
    str         Read(int size);
    str         ReadPos(int size, int pos);
    str         ReadStr(int pos, strdata*_str);
    int         Write(str data);
    int         WritePos(uint data, int size, int pos);
    int         WriteStr(str data, int pos);
    int         Number(str rdata, int size);
    int         Close();
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2014, 16:13
Ответы с готовыми решениями:

Asus S301L вместо з пишет *
Всем привет. у меня ноут Asus S301L Сегодня вдруг стал писать вместо буквы з или английской p...

В адресной строке вместо localhost пишет [::1]
Добрый день. У меня в адресной строке сайта на локале, вместо localhost пишет Что это не пойму, в...

Cout пишет адрес вместо значения
cout пишет адрес вместо значения. Спасибо

Глючит fwrite (пишет 5 байт вместо 4)
Среда: C++ Builder 2010. В некий файл пишутся всякие бинарные данные (типы char/int/long) при...

4
Evg
Эксперт CАвтор FAQ
21204 / 8220 / 633
Регистрация: 30.03.2009
Сообщений: 22,542
Записей в блоге: 30
04.10.2014, 18:44 2
Лучший ответ Сообщение было отмечено Убежденный как решение

Решение

Это некая особенность систем DOS и Windows, где для кодирования перевода строки используется два символа - 10 и 13, в то время как на прочих системах - только один символ. Все интерфейсы высокого уровня устроены так, что ты отдаёшь один байт, а они пишут два. Так сделано, чтобы исходники программ были переносимыми. Чтобы один и тот же исходный текст после компиляции под юниксом печатал один символ для перевода строки, а вод виндами - два.

Чтобы эта борода была настраиваемой, в те же самые интерфейсы верхнего уровня ввели понятие "текстовый файл" и "бинарный файл". Если файл открыть как "текстовый", то перевод строки будет кодироваться двумя байтами, а если открыть как "бинарный", то не будет.

http://www.cplusplus.com/refer... ream/open/

Вместо

C++
file.open(filename,std::fstream::out)
надо

C++
file.open(filename,std::fstream::out | std::fstream::binary)
Ну а тем, кто программирует на Си, соответственно, вместо

C
FILE *f = fopen ("filename", "r");
нужно

C
FILE *f = fopen ("filename", "rb");
Ну и ссылка на всякий случай
https://ru.wikipedia.org/wiki/... 0%BA%D0%B8
1
Я в этом не шарю
3 / 3 / 3
Регистрация: 03.09.2014
Сообщений: 191
06.10.2014, 11:26  [ТС] 3
Evg, спасибо.
кстати проэкт скомпиленный на ubuntu такой проблемой не отличался.
там все записывалось правильно.
0
Evg
Эксперт CАвтор FAQ
21204 / 8220 / 633
Регистрация: 30.03.2009
Сообщений: 22,542
Записей в блоге: 30
06.10.2014, 12:20 4
Цитата Сообщение от Segaman Посмотреть сообщение
там все записывалось правильно
Что есть "правильно", а что "не правильно" - это вопрос немного мутный. В конкретно данном случае неправильной следует считать твои исходники, а не результат исполнения
0
Я в этом не шарю
3 / 3 / 3
Регистрация: 03.09.2014
Сообщений: 191
13.10.2014, 11:49  [ТС] 5
новая проблема. пытаюсь читать текст "Неделя-2", программа прочитывает текст, но после чтения "работа программы была прекращена". причем если написать "Неделя -2", всё нормально читается.
перепробовал все, даже текстовый режим пробовал включать, но все равно такая комбинация вызывает ошибку.
рослеживал размер текста, длинну текста. всё верно. 400ggпп-2 прочитало нормально
в хексе у меня2 байта длинна текста и далее сам текст. код чтения текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
pstr FDB_FILE::ReadStr(int pos, strdata*_str)
{
    if (!IsOpen()||err)
        return new char(0);
 
    int size;
    pstr temp;
 
    if (pos+1<GetSize())
    {
        file.seekg(pos,file.beg);
        size = Number(ReadPos(2,pos),2);//Number преобразует char[] в число
        //std::cout<<size<<std::endl;
        temp = ReadPos(size,pos+2);
        temp[size]=0;
        //std::cout<<temp<<std::endl;
    }else{
        temp = new char(0);
        size = 1;
        err = true;
        errname = "Read String pos bigger than file size";
        Close();
    }
    if (_str)
    {
        _str->data = temp;
        _str->length = size;
        //std::cout<<"ret"<<std::endl;
    }
    return temp;
}
мистика какая-то

Добавлено через 2 минуты
такое чуство, что fstream читает какие-то 2 символа как один, или же просто какой-то символ пропускает и это и является проблемой

Добавлено через 4 минуты
вообщем нашёл когда это происходит.
если символов к прочтению 8 и если текст оканчивается цифрой, получается ошибка

Добавлено через 3 минуты
нет скорее если вообще длинна текста 8 символов

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
pstr FDB_FILE::ReadPos(int size, int pos)
{
    if (!IsOpen()||err)return new char(0);
    if (size>datamax)
    {
        err = true;
        errname = "Read size bigger than 'datamax'";
        Close();
        return new char(0);
    }
    if (size+pos>GetSize())
    {
        err = true;
        errname = "Read size bigger than file size";
        Close();
        return new char(0);
    }
 
    //delete [] data;
    data = new char[size];
    file.seekg(pos,file.beg);
    file.read(data,size);
    data[size]=0;
    return data;
}
Добавлено через 46 минут
странно, но помогла пересборка всего проэкта.
танцы с бубном продолжаются
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2014, 11:49

Вместо открытия браузера программа пишет букву
Итак, я хочу, чтобы когда пользователь писал программе &quot;открой браузер&quot; она нам задавала вопрос...

в бд в столбце string пишет 1 вместо нужной мне строки
вобщем есть калькулятор, результаты его работы мне нужно сохранять в бд &lt;?php //Дата $date...

Надо исправить задачу (ошибка пишет в while) или перепишите вместо while, в for
var a:array of integer; st:array of integer; rez:array of integer; sum,i,j,k,x,s,n:integer;...

При создании таблицы из Lazarus в Excel вместо русских букв пишет ?
procedure TForm1.ButtonOtchetClick(Sender: TObject); var wss: String; ExcelApp, Workbook,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.