Другие языки программирования и технологии

C++ Как изменить программу, чтобы после каждого заданного символа вставлялся (не заменялся) символ "\n".

#include "pch.h"
#include
#include
#include
#include
#include
#define BUF_SIZE 256
int _tmain(int argc, LPTSTR argv[]) {
HANDLE hIn, hOut;
DWORD nIn, nOut, i, j;
CHAR Buffer[BUF_SIZE], wordi[2];
setlocale(LC_ALL, "Russian");
if (argc != 4) {
printf("Использование: cpw файл1 файл2\n");
return 1;
}
hIn = CreateFile(argv[1], GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hIn == INVALID_HANDLE_VALUE) {
printf("Невозможно открыть входной файл. Ошибка: %x\n", GetLastError());
return 2;
}
hOut = CreateFile(argv[2], GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH, NULL);
if (hOut == INVALID_HANDLE_VALUE) {
printf("Невозможно открыть выходной файл. Ошибка: %x\n", GetLastError());
return 3;
}
while (ReadFile(hIn, Buffer, BUF_SIZE, &nIn, NULL) && nIn > 0) {
wordi[0] = argv[3][0];
i = nIn;
for (j = 0; i - 1 > j; j++)
{
if (Buffer[j] == wordi[0])
{
Buffer[j++] = ' \n';
}
printf("%c", Buffer[j]);
SetFilePointer(hOut, 0, NULL, FILE_BEGIN);
WriteFile(hOut, Buffer, nIn, &nOut, NULL);
SetEndOfFile(hIn);
if (nIn != nOut) {
printf("Неустранимая ошибка записи: %x\n", GetLastError());
return 4;
}
}
}
CloseHandle(hIn);
CloseHandle(hOut);
return 0;
}
читать/писать побайтно
Сергей Козырь
Сергей Козырь
72 284
Лучший ответ
Жека Лемешевский как это делается на C++?
дарю функции на posix C для вставки по оффсетам, я просто лавинно переписывал файл по размеру вставленного сообщения, работает нормально, но для больших файлов нужны более хитрые подходы

вот например статья как это делают умные люди https://habr.com/company/jugru/blog/424763/

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

int replace_at(int fd, off_t offset, const char* s, int n)
{
off_t hook = lseek(fd, offset, SEEK_SET);
if (hook == -1) {
return -1;
}

ssize_t written = write(fd, s, n);
if (written == -1){
return -1;
}

return hook + written;
}

int insert(int fd, off_t offset, const char* s, int n)
{
off_t end = lseek(fd, 0, SEEK_END);
off_t hook = lseek(fd, offset, SEEK_SET);
if (hook == -1 || end == -1) {
return -1;
}

if ((hook + (off_t)n) > end)
{
void* buf = (void*)malloc(end - hook);
ssize_t read_status = read(fd, buf, (end - hook));
if (read_status == -1){
free(buf);
return -1;
}

hook = replace_at(fd, hook, s, n); // check?
ssize_t written = write(fd, buf, strlen(buf));
if (written == -1){
free(buf);
return -1;
}
free(buf);
}
else
{
void* buf = (void*)malloc(n);
ssize_t read_status = read(fd, buf, n);
if (read_status == -1){
free(buf);
return -1;
}
hook = replace_at(fd, hook, s, n); // check?

while (hook < end + (off_t)n)
{
if ((hook + (off_t)n) > end)
{
void* temp = (void*)malloc(end - hook);
ssize_t read_status = read(fd, temp, (end - hook));
if (read_status == -1){
free(temp);
return -1;
}

hook = replace_at(fd, hook, buf, n); // check?
ssize_t written = write(fd, temp, strlen(temp));
if (written == -1){
free(temp);
return -1;
}
free(buf);
free(temp);
} else
{
void* temp = (void*)malloc(n);
ssize_t read_status = read(fd, temp, n);
if (read_status == -1){
free(temp);
return -1;
}

hook = replace_at(fd, hook, buf, n); // check?
free(buf);
buf = temp;
}
}
}
return (int)end + n;
}
M R
M R
34 259
А что должна делать программа?
Принимает в качестве аргументов входящий файл, исходящий и набор символов, после которых надо всавить '\n' или нет?
Gott Free
Gott Free
11 084