Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/89: Рейтинг темы: голосов - 89, средняя оценка - 4.51
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 213

Запись в начало файла

19.08.2014, 10:13. Показов 17811. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте мне нужно записать слово "zashivrovano" в начале каждого файла:
я так понял алгоритм следующий:
1) Создаем новый файл

2) Пишем в него слово Zsdhifrovano

3) Дописать данные из старого файла

4) удалить старый файл

5) Переименовать новый файл в имя старого

Вопрос:

А какой функцией дописывать данные из старого файла в новый?

и вопрос лучше реализовывать с помощью потоков ofstream и ifstream

я так понял файл нужно считать в буфер но если файл большой допустим 2гб?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.08.2014, 10:13
Ответы с готовыми решениями:

Запись в начало файла.
Объясните мне плиз на пальцах, как записать данный в начало файла? То есть чтобы старые данные остались, а новые добавились перед ними....

Запись в начало файла
Пример : 1 2 3 4 5 6 -> 6 5 4 3 2 1 1 2 3 4 5 6 #include<iostream> #include <fstream> #include <string> using namespace...

Запись данных в начало файла
Есть структура. Нужно добавлять данные в бинарный файл в начало. #include "stdafx.h" #include <stdio.h> #include...

14
 Аватар для A_Kamolins
4 / 4 / 5
Регистрация: 15.08.2014
Сообщений: 30
19.08.2014, 10:57
Мне кажется, что можно было просто открыть файл, переставить указатель в начало и оттуда начать запись в файл. Всё старое просто передвинется, а то, что тебе было необходимо записать - окажется в самом начале. Ну, если я не прав, можно просто считать из файла в вектор к примеру, затем перезаписать в него то, что тебе надо, после чего - дозаписать то, что ты считал в вектор.

И - да, думаю тут лучше ifstream, ofstream / fstream
0
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 213
19.08.2014, 11:04  [ТС]
"просто считать из файла в вектор к примеру"

как это делается?
0
 Аватар для A_Kamolins
4 / 4 / 5
Регистрация: 15.08.2014
Сообщений: 30
19.08.2014, 11:24
kold2015, вы не пробовали сперва просто дописать эту фразу в начало файла?

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
 
using namespace std;
 
int main() {
    ifstream input("file.txt");
    vector<int> vec;
    copy(istream_iterator<int> (input), istream_iterator<int>(), back_inserter(vec));
    copy(vec.begin(), vec.end(), ostream_iterator<int> (cout, " ") );
}
0
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 213
19.08.2014, 11:53  [ТС]
гуглил везде вроде пишут что нельзя добавит в начало файла
нужно действовать по алгоритму который я написал выше
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
19.08.2014, 11:55
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/////////////////////////////////////////////////////////////////////////////////////////
//нужно записать слово "zashivrovano" в начале каждого файла
/////////////////////////////////////////////////////////////////////////////////////////
#include <complex>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
template< class T >
void    file_push_front
        (
            T_str   const   &   filename,
            T       const   &   val
        )
{
    std::fstream        file( filename );
    std::ostringstream  sout;
 
    sout    <<  val
            <<  file.rdbuf();
 
    file.seekp(0);
    file    <<  sout.str();
}
/////////////////////////////////////////////////////////////////////////////////////////
void    print_file( T_str   const   &   filename )
{
    std::ifstream   ifile( filename );
 
    std::cout   <<  ifile.rdbuf()
                <<  std::endl;
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    const   T_str   FILE_NAME   =   "out.txt";
    std::ofstream   ofile( FILE_NAME );
 
    file_push_front
        (
            FILE_NAME,
            1111111111
        );
 
    file_push_front
        (
            FILE_NAME,
            "aaaaaaaaaa"
        );
 
    file_push_front
        (
            FILE_NAME,
            std::complex<int>( 55, 777 )
        );
 
    file_push_front
        (
            FILE_NAME,
            "zashivrovano"
        );
 
    print_file( FILE_NAME );
 
    system("pause");
}
0
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 213
20.08.2014, 10:13  [ТС]
сделал я через временный файл

Добавлено через 17 часов 16 минут
вот моя реализация

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void priznakshifr(QString put)  //put-- outFilePath
{
    QMessageBox msg;
    //put ???????? ????
 
    QByteArray ar=put.toLocal8Bit();  //????????? ?????? ??? ????? ? ????????? ?? char
    char *imystarfaila=ar.data();
 
    msg.setText(QString::fromLocal8Bit("??? ????????? ?????  ")+QString::fromLocal8Bit(imystarfaila));
    msg.exec();
 
    QFile file(put);  //?????????? ?????? ??????? ????? ? ?????? //???? ????? ?????????-outfilepath
    qint64 pere=file.size();  // ?????? ?????? ????? ? ??????
    char buf[pere];  // ??????? ?????? ??? ???????? ?????????? ??????? ?????
 
    QString rr=QFileInfo(put).absoluteFilePath();  //?????? ?????? ???? ? ?????
    QString novfail=rr+"1";   //??? ?????? ?????????? ?????  //??? ?????????? ?????
 
    QByteArray br=novfail.toLocal8Bit();   // ????????? ????? ??? ????? ? ????????? ?? char
    char *imynovfaila=br.data();
 
    msg.setText(QString::fromLocal8Bit("??? ?????? ????? ")+QString::fromLocal8Bit(imynovfaila));
    msg.exec();
 
    ofstream f(imynovfaila);   //????????? ????? ????????? ???? (???? ??? ??? ?? ??????? ??? ?????????????)
    f<<"zashivrovano";  // ????? ? ???? ???????? ?????
 
    ifstream g;
    g.open(imystarfaila);   // ????????? ?????? ????
    g.read(buf,pere);  // ?????? ?????? ? ????? ?? ??????? ?????
    f.write(buf,pere);  // ????? ?? ?????? ? ????? ????
 
    file.remove();  //??????? ?????? ????
 
 
    QFile file2(novfail);   // ??????????????? ????? ???? ? ??? ???????
    file2.rename(put);
 
    msg.setText(QString::fromLocal8Bit("??? ????????? ????? ????? ???? ????????")+QFileInfo(file2).absoluteFilePath());
    msg.exec();
 
 
 
    g.close();
    f.close();
только подойдет ли для больших файлов?
0
 Аватар для Unifan
0 / 0 / 0
Регистрация: 11.08.2014
Сообщений: 40
20.08.2014, 18:25
А нельзя просто использовать имя-потока.seekp(кол-во байтов, ios::end)? Смещаем указатель в начало файла с конца, и выводим в него имя-потока << "zashifrovano\n";

Просто так проще получается, нежели приведенные варианты выше, не?
0
1 / 1 / 0
Регистрация: 18.02.2014
Сообщений: 213
20.08.2014, 19:39  [ТС]
помойму нельзя файл затирается
0
 Аватар для Unifan
0 / 0 / 0
Регистрация: 11.08.2014
Сообщений: 40
20.08.2014, 19:44
kold2015, а почему ты не рассмотрел вариант копирования файла в буфер с помощью get(), вывода требуемого слова и последующим выводом файла?
0
 Аватар для Наталья8
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,031
24.12.2021, 00:42
SYSTEMTIME st;
GetLocalTime(&st);
std::string folder_name = std::to_string(st.wDay) + "." + std::to_string(st.wMonth) + "." + std::to_string(st.wYear)
+ " -- " + std::to_string(st.wHour) + "." + std::to_string(st.wMinute);// <== c11 есть to_wstring(

std::ofstream fileOUT(buf, std::ios::app); //Пишем в файл (В конец в нормальном режиме)
static char tmp[50]; sprintf(tmp, "%s%s", "---------------------------------- ", folder_name.c_str());

fileOUT << tmp << std::endl;
fileOUT << chBuffer << std::endl; // append "some stuff" to the end of the file
fileOUT.close(); // close the file

Sleep(100);
// =========================== Чтение всего текста в массив
std::ifstream fin;
fin.open(buf, std::ifstream::binary);// Открываем в бинарном режиме
// Проверяем, удалось ли файл открыть.
if (!fin.is_open()) std::cerr << " Что-то пошло не так и текст не был открыт " << std::endl;
else {
fin.seekg(0, std::ios_base::end);// Перемещаем текущую позицию в файле в конец.
size_t f_size = fin.tellg();// Получаем текущую позицию.
fin.seekg(0, std::ios_base::beg);// Возвращаем текущую позицию в начало файла.
//-----------------------------------
char *arr = new char[f_size];// Выделим динамически память соответствующего размера.
fin.read(arr, f_size);// Читаем весь текст
if (fin)
{// --- прочитано нормально
fin.close();// прочитал в массив, Файл больше не нужен, можно закрыть.
Sleep(100);
// ================================= Записать из массива обратно в тот же файл с сортировкой
std::ofstream dst(//out_filename ------- Открываем такой же файл, замещая старый
buf, std::ios::binary);
for (int i = (f_size - strlen(chBuffer) - strlen(tmp)
- 2); i < f_size; ++i) dst << arr[i];// С конца массива последний буфер.

for (int i = 0; i < f_size - strlen(chBuffer) - strlen(tmp)
- 4; ++i) dst << arr[i];// С начала массива что было в файле раньше.

dst.close();// Закрываем его
//-------------------------------
}
delete[] arr;
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
24.12.2021, 01:36
Цитата Сообщение от Наталья8 Посмотреть сообщение
static char tmp[50]; sprintf(tmp, "%s%s", "---------------------------------- ", folder_name.c_str());
"50 символов должно хватить всем"! Особенно если мы истратим первые 35 из них на "---------------------------------- ".

Непонятно, почему static...

Цитата Сообщение от Наталья8 Посмотреть сообщение
std::string folder_name = std::to_string(st.wDay) + "." + std::to_string(st.wMonth) + "." + std::to_string(st.wYear)
+ " -- " + std::to_string(st.wHour) + "." + std::to_string(st.wMinute);
Подсчитываем... 2+1+2+1+4+4+2+1+2 = 19.

19+35 = 54... Тогда понятно, почему static...
0
 Аватар для Наталья8
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,031
24.12.2021, 16:55
/* Понятно тема старая
просто я в интернете ни чего не нашёл
три вечера сам изобретал.
Могу. работает.
Это я из буфера виндовс в текст.
Маленькая програмулина, но гавнистая.
*/

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
if (memcmp(old, chBuffer, strlen(old)) != 0 && strlen(chBuffer) < lenght)
              {// Если содежимое буфера изменилось 
                Beep(4000, 8);
    //          std::cout << strlen(chBuffer) <<" --- " <<std::endl;
                SYSTEMTIME st;
                GetLocalTime(&st);
std::string folder_name = std::to_string(st.wDay) + "." + std::to_string(st.wMonth) +
                       "." + std::to_string(st.wYear) + " -- " + std::to_string(st.wHour) +
                              "." + std::to_string(st.wMinute);// <== c11 есть to_wstring(  
 
            std::ofstream file_app(buf, std::ios::app); //Добавляем в конец файла (в норм. режиме)
          sprintf(tmp, "%s%s", "---------------------------------- ", folder_name.c_str());
    file_app << tmp << std::endl;
    file_app << chBuffer << std::endl; // append "some stuff" to the end of the file    
    file_app.close(); // close the file 
 
                Sleep(100);
            // =========================== Чтение всего текста в массив
                std::ifstream fin;
                fin.open(buf, std::ifstream::binary);// Открываем в бинарном режиме
                // Проверяем, удалось ли файл открыть.
        if (!fin.is_open()) std::cerr << " Что-то пошло не так и текст не был открыт " << std::endl;
                else {
                    fin.seekg(0, std::ios_base::end);// Перемещаем текущую позицию в файле в конец.
                    size_t f_size = fin.tellg();// Получаем текущую позицию. 
                    fin.seekg(0, std::ios_base::beg);// Возвращаем текущую позицию в начало файла.
                    //-----------------------------------
    char *arr = new char[f_size];// Выделим динамически память соответствующего размера.
                    fin.read(arr, f_size);// Читаем весь текст
                    if (fin)
                    {// --- прочитано нормально
                fin.close();// прочитал в массив, Файл больше не нужен, можно закрыть.      
                
                Sleep(100);
            // =============================== Записать из массива обратно в тот же файл с сортировкой
                short count_code(0);
                for (int i = 0; i < strlen(chBuffer); ++i)if ((int)chBuffer[i] == 10){ ++count_code; }
                   //-------------------------------
                std::ofstream  dst(//out_filename ------- Открываем такой же файл, замещая старый
                            buf, std::ios::binary);
                for (int i = (f_size - strlen(chBuffer) - strlen(tmp) - count_code
                            - 2); i < f_size; ++i) dst << arr[i];// С конца массива последний буфер.
 
                        for (int i = 0; i < f_size - strlen(chBuffer) - strlen(tmp)
                            - 4 - count_code; ++i) dst << arr[i];// С начала массива что было в файле раньше.
 
                            dst.close();// Закрываем его
                    }//-------------------------------
                delete[] arr;
                }   }
                
                Sleep(100);
            if (strlen(chBuffer) < lenght){
                memset(&old, 0, strlen(old));
                memcpy(old, chBuffer, strlen(chBuffer)); }
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
24.12.2021, 19:09
Изображения
 
0
 Аватар для Наталья8
617 / 375 / 67
Регистрация: 09.03.2016
Сообщений: 4,031
24.12.2021, 22:19
// Спасибо за критику исправил
// верхняя часть

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#pragma warning(disable : 4996)
#pragma warning(disable : 4703)// <------ Что бы не выёбывался компилятор
 
//-----------------------------------------
//  Сохраняет в тексте, всё скопированное , и прибавляет число / время
//-----------------------------------------
int _tmain(int argc, _TCHAR* argv[])
  {// <<--- Убираем консоль
    AllocConsole();  HWND Hide = NULL;
    
    while (!Hide){
        Hide = FindWindowA("ConsoleWindowClass", NULL); Sleep(50);
    }
ShowWindow(Hide, 0);
    setlocale(LC_ALL, "Russian");// Принимает русский путь...(проблемы с русскими путями)
    const short lenght(2048);
    static char old[lenght]{"hello_****ed_bull"};
    char tmp[64];
    static wchar_t buf[256];//Под путь на рабочий стол, с имянем ярлыка на конце
    LPITEMIDLIST pidl;
    SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidl);
    SHGetPathFromIDList(pidl, buf);
    wcscat(buf, L"\\HomeAction"); wcscat(buf, L"\\Clipboard.txt");
    //чтение текста из буфера обмена
    while (1){
        if (IsClipboardFormatAvailable(CF_TEXT))
        if (OpenClipboard(NULL))//открываем буфер обмена
                {
            HANDLE hData = GetClipboardData(CF_TEXT);//извлекаем текст из буфера обмена
            char* chBuffer = (char*)GlobalLock(hData);//блокируем память
            GlobalUnlock(hData);//разблокируем память
            CloseClipboard();//закрываем буфер обмена
            //------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.12.2021, 22:19
Помогаю со студенческими работами здесь

Ofstream запись в начало файла
Всем здрасьте ! Мне нужно с помощью ofstream записать данные в начало файла, а данные записанные до этого должны сохраниться !

Запись в начало файла
Пытался разобраться с флагами и параметрами функции CreateFile, почитал про OVERLAPPED в WriteFile, но ответа не нашёл (либо не осознал...

Запись в начало файла
Как вставить две строки текста (из переменной) в начало текстового файла?

Запись в начало файла
В какой то момент понадобилось реализовать эффект по аналогии команды &quot;tac&quot;. Взяв за базу исходный файл сделать реверс его содержимого. А...

Запись текста в начало файла
Всем привет! Есть файл .txt в каталоге res/raw и код, который записывает в этот файл значение переменной типа String. Но запись...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru