Чтение / запись двоичного файла в C ++ - PullRequest
0 голосов
/ 04 октября 2018

Как я могу создать бенчмарк ввода-вывода linux для операций чтения и записи двоичного файла с использованием C ++?

Я попытался сгенерировать файл размером 10 МБ с кодом ниже, но он возвращает меня "ошибка сегментации(core dumped) ".

#define FILE_SIZE 10240

#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

int main()

{
    int fd, i;
    int stream[FILE_SIZE];
    double span;

    clock_t start,end;

    start=clock();

    fd=open("data.bin", O_CREAT|O_TRUNC|O_WRONLY, S_IRWXU);

    srand(time(NULL));

    for(i=0; i<FILE_SIZE; i++){

        stream[i]=rand()%2;
        write(fd, (char*)stream[i], strlen((char*)stream[i]));

    }

    for(i=0; i<FILE_SIZE; i++)
        read(fd, (char*)stream[i], strlen((char*)stream[i]));

        close(fd);

        end=clock();
        time_lapse=((double)(end-start))/CLOCKS_PER_SEC;

        return 0;
}

Затем он возвращает мне некоторые предупреждения из-за преобразования, включенного в функции записи и чтения, я уверен, что есть лучший способ сделать это.

Может ли кто-нибудь мне помочь?

Заранее спасибо, Антонио

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

strlen((char*)stream[i]) неверно, потому что stream[i] равно int, а не char*.Следовательно, strlen будет продолжать чтение памяти, пока не найдет 0 байт или не исчерпает отображенную память, и вы не получите SIGSEGV.

Fix: sizeof stream[i].

0 голосов
/ 04 октября 2018

Ваша самая большая проблема в том, что вы воспринимаете stream[i] как строку! Это , а не строка, это int значение.

Использование &stream[i] чтобы получить указатель на него, и использовать sizeof stream[i], чтобы получить его размер.На самом деле вам не нужно писать каждый элемент отдельно, вы можете просто написать весь массив сразу:

write(fd, stream, sizeof stream);

Вы можете прочитать его точно так же.

Большой знакпроблема в том, что вам нужно использовать кастинг в стиле C.Если вам нужно сделать это в C ++, то это то, что вы делаете что-то, что делать не следует.


Кроме того, что вы на самом деле ничего не делаете для C ++, ваш код может быть простым C.

Решение C ++ будет использовать вместо std::fstream.

Если вам все еще нужно использовать низкоуровневую функцию POSIX, не забудьте проверка ошибок .Каждая функция, которую вы вызываете, может завершиться ошибкой.И это на самом деле включает в себя вызов close.

...