LINUX.ORG.RU

C++ Работа с бинарными файлами

 ,


0

1

Добрый ... всем! Пытаюсь обработать бинарные файлы в каталоге bin в цикле. Первое что я сделал это в buf загнал название файла, потом соединил их с путем. Далее преобразовал в const char* и передал функции ifstream. Ниже код и описание проблемы.

#include <stdio.h>
#include <iostream>
#include <fstream>
#include <ctime>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
using namespace std;
int main(int argc, const char ** argv)
{
        char buf[1024];
        FILE * ls;
        int result;
        int i;
        const char* fname;
        strcpy(buf,"ls ./Bin/");
        for (i=1; i < argc; i ++) {
                strcat (buf, argv[i]);
                strcat (buf, " ");
        }
        ls = popen(buf,"r");
        if(!ls){
                perror("popen");
                return 1;
        }
        while(fgets(buf, sizeof(buf), ls)) {
                std::string namefile = std::string("./Bin/") + buf;
                fname = namefile.c_str();
                ifstream instrm (fname, std::ios::binary);
                //printf ("%s\n", fname);
                signed short t[240000] = {0};
                instrm.read((char *)t, sizeof(t));      // чтение файла в массив
                instrm.close();                         // закрываем
                for(int i = 0; i < sizeof(t)/sizeof(*t); i++){   // цикл вывода массива
                        cout << t[i] << ' ';
                }
                cout << '\n';
        }
        result = pclose(ls);
        if(!WIFEXITED(result)) return 1;
        return 0;
}

Проблема в том что если я ставлю переменную

ifstream instrm (fname, std::ios::binary);
не работает нули идут, а если указываю файл работает.
ifstream instrm ("./Bin/file.bin", std::ios::binary);
Ошибок при компиляции нет!

char buf[1024];

namefile = std::string("./Bin/") + buf;

Я не программист, но вот это точно нормально?

Что выводится для namefile?

grem ★★★★★ ()
Ответ на: комментарий от grem

Да нормально. Переменная namefile нужна что бы создать строку типа ./Bin/file1.bin и по циклу 2 3 4. И далее по описанию функции explicit ifstream (const char* filename, ios_base::openmode mode = ios_base::in); Мне ее надо преобразовать в const char* что ниже и делается переменная fname.

prostoR ()
Ответ на: комментарий от prostoR

Не, я про то, что там складываются разные типы (string + char), но кто его знает, вдруг сам преобразует.

А ворнинги есть при компиляции? Если с опцией -Wall?

grem ★★★★★ ()
Последнее исправление: grem (всего исправлений: 1)
Ответ на: комментарий от grem

С -Wall есть, без компиляция проходит.

readfile.cpp: In function ‘int main(int, const char**)’:
readfile.cpp:44:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
          for(int i = 0; i < sizeof(t)/sizeof(*t); i++){   // цикл вывода массива

Но предупреждение не касается этой проблемы. Для не программиста Вы вполне осведомлены:)

prostoR ()

смотрю я на это и думаю какого написано с++ и понять не могу. Зачем вот это

fname = namefile.c_str();

если ifstream прекрасно стринги на вход получает. Цель вот такого хода
signed short t[240000] = {0};               instrm.read((char *)t, sizeof(t));

Мне тоже не понятна.

Silerus ★★★ ()
Последнее исправление: Silerus (всего исправлений: 1)

while(fgets(buf, sizeof(buf), ls)) {
std::string namefile = std::string("./Bin/") + buf;
fname = namefile.c_str();

fgets() встречает символ перевода строки '\n' и заканчивает чтение, помещая, тем не менее, этот символ в buf. Если уж остальное не менять, удаляй этот последний символ из строки namefile.

aquafresh ()
Ответ на: комментарий от Silerus

Стринги как вы говорите я пробовал, у меня не работает.

signed short t[240000] = {0};
instrm.read((char *)t, sizeof(t));
Это относиться к файлу и описанной проблемы не касается.

prostoR ()

А вы строку с отладночной печатью вот в такой вид преобразуйте:

printf ("'%s'\n", fname);
понятнее станет.

eao197 ★★★★★ ()
Ответ на: комментарий от aquafresh

Да вы были правы проблема была в переносе строки. Добавил

namefile.resize(namefile.size() - 1);
Заработало.

prostoR ()

А что будет, если путь будет содержать пробел? Как вы собираетесь отличать путь от его части?

andreyu ★★★★★ ()

Жуткий замес из С и С++, cтримы и fgets-ы. Струп может тобой гордиться!

anonymous ()
        char buf[1024];
        FILE * ls;
...
        strcat (buf, " ");


Слушай, ты уж определись: ты пишешь на Си или C++. У тебя сейчас дикая чехарда в коде. Оттого и проблемы.

Kroz ★★★★★ ()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от samson

да можно уже сейчас взять boost откуда filesystem и взят

anonymous ()
Ответ на: комментарий от Kroz

Там полноценный C++. std::FILE, std::strcat - ссылки на документацию из плюсов дать?

dzidzitop ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.