crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> считывание строки из файла(QFile)
Гость_Гость_*
сообщение 12.7.2015, 23:20
Сообщение #1





Гости








    


Добрый вечер.
Прошу помочь с проблемой.

Когда записываю строку в файл:
QFile file;
    file.setFileName("File.txt");
    file.open(QIODevice::ReadWrite);  


    QString str="Hello";

    file.write((char*)&str,sizeof(str));
    
    file.close();

    qDebug()<<str;

Все записывается в файл.
А когда пытаюсь считать:
QFile file;
    file.setFileName("File.txt");
    file.open(QIODevice::ReadWrite);   //QIODevice::WriteOnly,ReadOnly,Text - не помогают.


    QString str;

    file.read((char*)&str,sizeof(str));
    
    file.close();

    qDebug()<<str;


Приложение аварийно завершается, в чем проблема?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ahalaj
  опции профиля:
сообщение 13.7.2015, 9:28
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 47
Регистрация: 14.6.2014
Пользователь №: 4166

Спасибо сказали: 13 раз(а)




Репутация:   1  


Не инициализируешь QString чтобы в ней хватило места для прочитанной строки, в результате строка читается или в никуда, или возникает переполнение стека.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 13.7.2015, 11:30
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Нет, нет, нет.

Так делать нельзя, вы записываете на строку, а внутреннее представление строки в памяти.
То что там какие то символы читаются в файле, просто деталь реализации.

Для ввода и вывода строк используйте
http://doc.qt.io/qt-5/qtextstream.html#details
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 13.7.2015, 14:40
Сообщение #4





Гости








    


lanz, а для чего тогда эти функции?? ( QFile::read(), QFile::write() ) , и ещё вопрос. В файле какие-то иероглифы, функция QFile::write(), записывает данные в двоичном коде, или это кодировка какая?

Спасибо за ответы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 13.7.2015, 14:56
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Эти функции для считывания/записи байт/двоичных данных из файла.
QTextStream использует их внутри себя, только он потом еще разбирается с кодировками и всяким таким и подготавливает правильные объекты QString.

Иероглифы это скорее всего внутренние данные класса QString, которые не предназначены для записи.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 13.7.2015, 15:26
Сообщение #6





Гости








    


А как тогда считать из файла какие-нибудь данные, и, скажем строку. К примеру, в файле есть строка: "Автомобили: 56". Как считать ее так, чтобы с 56 можно было проводить арифметические действия.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 13.7.2015, 15:45
Сообщение #7


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Считать как строку, потом выделить часть про 56, потом преобразовать ее в число методом
http://doc.qt.io/qt-5/qstring.html#toInt
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 13.7.2015, 16:08
Сообщение #8





Гости








    


Тогда в файле должно быть без пробелов написано, вот так- " Автомобили:56 ", и как быть, если чисел не одно, а несколько, " Автомобили:56 12.15 ". А QDataStream приемлемо будет использовать в этом случае?

И ещё вопрос, как выделить часть с цифрами?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 13.7.2015, 16:26
Сообщение #9


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Это уже задача программиста :lol:

Для считывания чисел используйте
http://doc.qt.io/qt-4.8/qtextstream.html#operator-gt-gt-2
и другие перегрузки.

Для разбора строки можно использовать посимвольные циклы или регулярные выражения.

QDataStream работает с двоичными данными, вам он тут не поможет.

Придумайте пошаговый алгоритм, как решить вашу задачу, опишите его на обычном русском языке,
потом подумаем ка перевести это для компьютера ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 13.7.2015, 16:48
Сообщение #10





Гости








    


Я нашел 2 решения.
Первое.
В файле " Hello:51 "

"Первый способ"


QFile file;
    file.setFileName("File1.txt");
    file.open(QIODevice::ReadWrite);

    QString str;

    QTextStream stream(&file);
    stream>>str;

    QString numStr;
    for(int i(0);i<str.size();i++)
    {
        if(str.at(i).isNumber())
        {
            numStr+=str.at(i);
        }
    }
    qDebug()<<numStr;
    double x=numStr.toDouble();

    x+=54.5;
    qDebug()<<x;
    file.close();


Вроде работает, и складывает, вывел 105.5.

И второй способ, с QDataStream.

"Второй способ"

    QFile file;
    file.setFileName("File1.txt");
    file.open(QIODevice::ReadWrite);

    QString str="Hello";
    double x=15.2;
    int y=11;

    QDataStream stream(&file);

    stream>>str>>x>>y;

    qDebug()<<str<<x<<y;

    file.close();


Записали в файл.


    QFile file;
    file.setFileName("File1.txt");
    file.open(QIODevice::ReadWrite);
    QString str;
    double x;
    int y;

    QDataStream stream(&file);

    stream>>str>>x>>y;

    qDebug()<<str<<x<<y;

    file.close();


Считали.


Какой способ лучше и быстрее? И вообще, правильно делаю ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 16.11.2024, 0:15