Двоичный файл перезаписывает только первую строку C ++ - PullRequest
0 голосов
/ 05 мая 2011

Итак, у меня есть двоичный файл, который я создаю и инициализирую. Если я установлю свой указатель на seekg = 0 или seekp = 0, тогда я могу перезаписать строку текста нормально. Однако, если я прыгаю вперед на 26 байтов (размер одной строки моего файла и что-то, что я определенно подтвердил), он отказывается перезаписывать. Вместо этого он просто добавляет его перед двоичными данными и помещает старые данные дальше в строку. Я хочу, чтобы данные были полностью перезаписаны.

char space1[2] = { ',' , ' '};
int main()
{
    CarHashFile lead;
    lead.createFile(8, cout);
    fstream in;
    char* tempS;
    tempS = new char[25];
    in.open("CarHash.dat", ios::binary | ios::in | ios::out);
    int x = 2000;
    for(int i = 0; i < 6; i++)
        tempS[i] = 'a';
    int T = 30;
    in.seekp(26);        //Start of second line
    in.write(tempS, 6);    //Will not delete anything, will push
    in.write(space1, sizeof(space1));  //contents back
    in.write((char *)(&T), sizeof(T));
    in.write(space1, sizeof(space1));
    in.write(tempS,6);
    in.write(space1, sizeof(space1));
    in.write((char *)&x, sizeof(x));
    //Now we will use seekp(0) and write to the first line
    //it WILL overwrite the first line perfectly fine
    in.seekp(0);
    in.write(tempS, 6);
    in.write((char*) &x, sizeof(x));
    in.write(tempS, 6);
    in.write((char *) &T, sizeof(T));
    return 0;
}

CarHashFile - это внешний класс, который создает двоичный файл, полный следующего содержимого, при запуске create file: "Free, " 1900 ", Black, $" 0.00f. Все, что заключено в кавычки, было добавлено в виде строки, 1900 в виде целого числа и 0,00f в виде числа с плавающей точкой. Я добавил все это с помощью записи, так что я почти уверен, что это настоящий двоичный файл, я просто не знаю, почему он выбирает запись только по первой строке. Я знаю, что размер файла правильный, потому что если я установлю seekp = 26, он будет печататься в начале второй строки и нажимать на него вниз. space был создан, чтобы легко добавить комбо "," в файл, также есть массив char dol[1] = '$' для простоты и char nl[1] = '\n', который позволяет мне добавить новую строку в двоичный файл (только что попытался удалить это двоичное добавление) и это заставило все в один ряд, так что, афаик, это нужно).

РЕДАКТИРОВАТЬ: Хорошо так, это стирало линию все время, это просто не вводило новую строку (вид смущения). Но сейчас я не могу понять, как вставить новую строку в файл. Я попытался написать это так, как делал изначально с char nl[1] = { '\n' }. Это сработало, когда я впервые создал файл, но потом не получится. Есть ли другие способы добавить строки? Я тоже попробовал in << endl и ничего не получил.

Ответы [ 2 ]

0 голосов
/ 05 мая 2011

Конечной проблемой было не мое понимание потоков файлов. Это было мое непонимание двоичных файлов. Новая строка по-королевски все испортила, и хотя в какой-то момент она могла быть добавлена ​​отлично, потом с этим было очень трудно. Как только я удалил это, все остальное встало на свои места просто отлично. И причина многих ошибок проверки или отсутствия закрытия файлов в том, что это просто код драйвера. Это настолько скромно, насколько это возможно, мне действительно было все равно, что случилось с файлом в тот момент, и я знал, что он открывается. Зачем тратить мое время? Окончательная версия имеет проверки ошибок, когда основная программа была переписана. И, как я уже сказал, я не получил двоичных файлов, а не файловых потоков. Так что ответ AJ был не очень полезен. И у меня должно было быть 25 символов как часть задания, ни одно имя не должно быть длиной в 25 символов, поэтому оно заполняется мусором. Это побочный продукт проекта, я ничего не могу с этим поделать, кроме как попытаться заполнить его пробелами, что занимает больше времени, чем пропуск вперед и запись оттуда. Поэтому я решил написать то, что, вероятно, будет средним именем (8 символов), а затем просто прыгнуть вперед на 25 после. Единственное реальное решение, которое я мог сказать, которое было дано здесь, было от Эмиля, который сказал мне, чтобы получить Hex Editor. Это действительно помогло. Спасибо за ваше время.

0 голосов
/ 05 мая 2011

Я предлагаю делать это по одному шагу за раз. код выглядит нормально для меня, но отсутствие проверки ошибок будет означать любое поведение. Добавьте проверки ошибок и отчеты для всех операций в. Если это не показывает никаких проблем, выполните простой поиск и напишите

result = in.pseek(26);
//print result 
result = in.write("Hello World",10);
// print result
in.close();

дает знать, что происходит

...