• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Работа с файлами

  • Автор темы Dareami
  • Дата начала
D

Dareami

Подскажите плз как делать вот это задание, кому не тяжело!
Даны два текстовых файла. Добавить в конец каждой строки первого файла соответствующую строку второго файла. Если второй файл короче первого, то оставшиеся строки первого файла не изменять.
Хоть что-то)
 
Z

zeus

тут все просто, открываешь два файла для чтения, и создаешь третий на запись, считываешь из каждого фала по строки по-очереди, пока один из них не закончиться... затем закрываешь все три файла и удаляешь первый, а третий переименовываешь в первый =)
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">...</div></div><div class="sp-body"><div class="sp-content">
C++:
#include<stdio.h>

int main(void)
{
FILE *f1 = fopen("file1.txt", "r");
FILE *f2 = fopen("file2.txt", "r");
FILE *f3 = fopen("temp", "w");

if (!f1 || !f2 || !f3)
{
// ошибка!
exit(1);
} // if

char buf[510];

while (!feof(f1) && !feof(f2))
{
fgets(buf, 255, f1);

int len = strlen(buf);
fgets(buf+len, 510-len, f2);

fputs(buf, f3);
} // while

fclose(f2);

while (!feof(f1))
{
fgets(buf, 255, f1);
fputs(buf, f3);
} // while

fclose(f1);
fclose(f3);

remove("file1.txt");
rename("temp", "file1.txt");

return 0;
} // main
 
D

Dareami

тут все просто, открываешь два файла для чтения, и создаешь третий на запись, считываешь из каждого фала по строки по-очереди, пока один из них не закончиться... затем закрываешь все три файла и удаляешь первый, а третий переименовываешь в первый =)
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">...</div></div><div class="sp-body"><div class="sp-content">
C++:
#include<stdio.h>

int main(void)
{
FILE *f1 = fopen("file1.txt", "r");
FILE *f2 = fopen("file2.txt", "r");
FILE *f3 = fopen("temp", "w");

if (!f1 || !f2 || !f3)
{
// ошибка!
exit(1);
} // if

char buf[510];

while (!feof(f1) && !feof(f2))
{
fgets(buf, 255, f1);

int len = strlen(buf);
fgets(buf+len, 510-len, f2);

fputs(buf, f3);
} // while

fclose(f2);

while (!feof(f1))
{
fgets(buf, 255, f1);
fputs(buf, f3);
} // while

fclose(f1);
fclose(f3);

remove("file1.txt");
rename("temp", "file1.txt");

return 0;
} // main
Тут добавляет в начало третьтей строки...((
 
F

F84

Я бы сделал так:
C++:
/////////////////////////////////////////////////
//Main.cpp
#include <fstream>
#include <string>
#include <iostream>
using namespace std;

bool isLimit(char c) {
char lim[] = {' ', '\t', '\n'};
for (int i = 0; i < sizeof(lim); ++i)
if (c == lim[i]) return true;
return false;
};


fstream& readLine(fstream& in, string* s) {
string word, equal = ".?!";
while (!in.eof()) {

char symb;
while (isLimit(symb = in.peek())) {
*s += symb;
if (symb == '\n') break;
in.seekg(1, ios::cur);
}

in >> word; 
*s += word;
char rn = word[word.size() - 1];
if (-1 != equal.find(rn)) {
*s += ' ';
return in;
}}
return in;
};



int main() {

string buf;
fstream fin("file1.txt", ios::in);
fstream fin2("file2.txt", ios::in);
if (!fin || !fin2) { cout << "Error open file." << endl; return 1; };


do {
fin = readLine(fin, &buf);
fin2 = readLine(fin2, &buf);
}while(!fin.eof() && !fin2.eof());

fin.close(); fin2.close();

fstream out("file1.txt", ios::out);
if (!out) { cout << "Error create output file." << endl; return 1; }
else { out << buf; out.close(); };

return 0;
};
/////////////////////////////////////////////////
 
D

Dareami

Я бы сделал так:
C++:
/////////////////////////////////////////////////
//Main.cpp
#include <fstream>
#include <string>
#include <iostream>
using namespace std;

bool isLimit(char c) {
char lim[] = {' ', '\t', '\n'};
for (int i = 0; i < sizeof(lim); ++i)
if (c == lim[i]) return true;
return false;
};


fstream& readLine(fstream& in, string* s) {
string word, equal = ".?!";
while (!in.eof()) {

char symb;
while (isLimit(symb = in.peek())) {
*s += symb;
if (symb == '\n') break;
in.seekg(1, ios::cur);
}

in >> word; 
*s += word;
char rn = word[word.size() - 1];
if (-1 != equal.find(rn)) {
*s += ' ';
return in;
}}

};



int main() {

string buf;
fstream fin("file1.txt", ios::in);
fstream fin2("file2.txt", ios::in);
if (!fin || !fin2) { cout << "Error open file." << endl; return 1; };


do {
fin = readLine(fin, &buf);
fin2 = readLine(fin2, &buf);
}while(!fin.eof() && !fin2.eof());

fin.close(); fin2.close();

fstream out("file1.txt", ios::out);
if (!out) { cout << "Error create output file." << endl; return 1; }
else { out << buf; out.close(); };

return 0;
};
/////////////////////////////////////////////////
Спасибо, но тут мало чего учили..
 
F

F84

Спасибо, но тут мало чего учили..

Сори, не заметил ошибку, в функции readLine(fstream& in, string* s) нужно поправить:
Код:
.........................
.........................
.........................
if (-1 != equal.find(rn)) {
*s += ' ';
return in;
}}
return in;
};

В пред. посте ошибку поправил, вроде, все работает нормально.
 
F

F84

Вы бы описали что именно вы подразумеваете под "но тут мало чего учили..", поставленная задача решается приведенным мной кодом. Была ошибка с условием "Если второй файл короче первого, то оставшиеся строки первого файла не изменять.", сейчас она устранена.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!