Russian Qt Forum
Ноябрь 25, 2024, 10:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: непонятки с fwrite fread  (Прочитано 3384 раз)
billidean
Гость
« : Июнь 16, 2015, 19:12 »

Добрый день всем.
Пишу такой код:
1. чтение файла в некий буфер (fread), запись параметров этого файла (размер, длину имени, имя) и сами данные из буфера в другой файл (fwrite).
2. чтение уже полученного файла (размера, длины имени, имя, тело данных).

При чтении имени в функции selectFile получаю какие-то лишние символы.
Вот код:
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    list.clear();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pb_Select_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this, "Select one file for load", "", "");
    if (fileName.isEmpty())
    {
        QMessageBox::critical(this, "Select file", "No selected file", QMessageBox::Ok);
        return;
    }
    QFileInfo file(fileName);
    qDebug() << fileName << " - " << file.filePath() << " - " << file.fileName() << " - " << file.size();
    file_t temp;
    temp.name = file.fileName();
    temp.path = file.filePath();
    temp.size_name = file.fileName().toLocal8Bit().count();
    temp.size = file.size();
    for( int i=0; i<list.count(); i++ )
    {
        if( list.at(i).name == temp.name )
        {
            QMessageBox::critical(this, "Select file", "This file name is already exist!", QMessageBox::Ok);
            return;
        }
    }
    list.append(temp);
    updateTable();
}

void MainWindow::on_pb_Compress_clicked()
{
    FILE *file_rom = fopen("new.rom", "wb");

    for( int i = 0; i < list.count(); i++ )
    {
        FILE *file_read = fopen(list.at(i).path.toLocal8Bit(), "rb");
        long size;
        size_t real_read;
        fseek(file_read, 0, SEEK_END);
        size = ftell(file_read);
        fseek(file_read, 0, SEEK_SET);
        // write size of current file
        fwrite(&list.at(i).size, sizeof(int), 1, file_rom);
        fwrite(&list.at(i).size_name, sizeof(int), 1, file_rom);

        // write name of current file
        std::string temp(list.at(i).name.toStdString());
        const char* name_ = temp.c_str();
        int tt = temp.size();
        qDebug() << "name_=" << name_ << "tt=" << QString::number(tt);
        fwrite(name_, sizeof(char), tt, file_rom);


        char buff[size];
        real_read = fread(buff, sizeof(char), size, file_read);
        fwrite(buff, sizeof(char), real_read, file_rom);
        fclose(file_read);
    }
    fclose(file_rom);


    std::string temp1(list.at(0).name.toStdString());
    const char* name_1 = temp1.c_str();
    selectFile(name_1);
}

void MainWindow::updateTable()
{
    ui->tableWidget->clear();
    ui->tableWidget->setRowCount( list.count() );
    for( int row = 0; row < ui->tableWidget->rowCount(); row++ )
    {
        for( int column = 0; column < ui->tableWidget->columnCount(); column++ )
        {
            ui->tableWidget->setItem(row, column, new QTableWidgetItem);
            ui->tableWidget->item( row, column )->setTextAlignment(Qt::AlignCenter);
        }
        ui->tableWidget->item(row,0)->setText( list.at(row).name );
        ui->tableWidget->item(row,1)->setText( QString::number(list.at(row).size) );
    }
}

int MainWindow::selectFile(const char *name)
{
    FILE *file_read = fopen("new.rom", "rb");
    fseek(file_read, 0, SEEK_SET);

    size_t real_read;
    int size_file;
    int size_name;
    real_read = fread(&size_file, sizeof(int), 1, file_read);
    real_read = fread(&size_name, sizeof(int), 1, file_read);

    char read_name[size_name];
//    real_read = fread(read_name, sizeof(char), size_name, file_read);
    real_read = fread(read_name, sizeof(read_name), 1, file_read);
    fclose(file_read);
    qDebug() << "size_name=" << size_name << " real_read=" << real_read << " read_name=" << read_name << " name=" << name;

    if( read_name == name )
        qDebug() << "ok";
    else
        qDebug() << "err";


    return -1;
}
При выполнении программы получаю в дебаге такие сообщения:
name_= ui_mainwindow.h tt= "15"
size_name= 15  real_read= 1  read_name= ui_mainwindow.hv?z??z???(  name= ui_mainwindow.h
err

Вот этот момент read_name= ui_mainwindow.hv?z??z???( меня убивает, и ничего сделать не получается.

Помогите ПЛЗЗЗ Плачущий Плачущий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Июнь 17, 2015, 06:43 »

Код:
    char read_name[size_name];
Код
C++ (Qt)
 
char read_name[size_name + 1] = { 0 };
 
Записан
billidean
Гость
« Ответ #2 : Июнь 18, 2015, 09:18 »

Спасибо за помощь.
Но это не помогло.
Помогло такое - после fread(..); вставить read_name[size_name]=0; (нашел в инете).
Но как это помогает избавиться от НЕСКОЛЬКИХ последних левых символов, пока не пойму, вроде зануляется только один, причем находящийся уже за пределами массива.
Может кто-нибудь объяснить, что делает эта строка в контексте моего кода (после операции fread), чтобы познать поглубже этот момент?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июнь 18, 2015, 09:42 »

Спасибо за помощь.
Но это не помогло.
Помогло такое - после fread(..); вставить read_name[size_name]=0; (нашел в инете).
Но как это помогает избавиться от НЕСКОЛЬКИХ последних левых символов, пока не пойму, вроде зануляется только один, причем находящийся уже за пределами массива.
Может кто-нибудь объяснить, что делает эта строка в контексте моего кода (после операции fread), чтобы познать поглубже этот момент?
Да, там надо было еще отнять единичку
Код
C++ (Qt)
char read_name[size_name + 1] = { 0 };
real_read = fread(read_name, sizeof(read_name) - 1, 1, file_read);
// real_read = fread(read_name, size_name, 1, file_read);  // или так
 
Строка в С заканчивается нулем. Напр
Код
C++ (Qt)
const char * str = "abc";
Это 4 символа (а не 3). При записи в файл ноль обычно не пишется, но при чтении его надо обеспечить, иначе будет мусор а может и вылет.
Записан
billidean
Гость
« Ответ #4 : Июнь 18, 2015, 09:59 »

Ясно. Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.19 секунд. Запросов: 22.