Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/19: Рейтинг темы: голосов - 19, средняя оценка - 4.58
laura

Файловый ввод-вывод

31.05.2011, 17:49. Показов 3630. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема вот в чем: надо несколько (пусть будет 2) разных файлов перемешать и записать в один. в файле-результате должны встречаться все строки из исходных файлов в случайном порядке.
Как это сделать на С или С++?

Заранее благодарна за помощь
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.05.2011, 17:49
Ответы с готовыми решениями:

Файловый ввод-вывод
Добрый день! Подскажите,как сделать дабы при вводе в файл можно было перейти на другую строку. Вот пример моего кода,что мне надо...

Файловый ввод С++ в С++ Builder
Здравствуйте! Подскажите, как объявить объект ifstream в С++ Builder! Делал так: #include<fstream> ifstream in; ...

Файловый ввод/вывод данных. решение? ;-)
Народ выручайте! Мне нужно решить 4 задачи по С++, я этот язык нифига не понимаю, проболел в начале когда нам его объясняли, а дальше сам...

10
Silver
06.06.2011, 09:15
Если файлы-источники текстовые, то удобно использовать
класс CStdioFile.
Использование очень простое. Если это еще интересно,
то могу накидать пример.
paradise
06.06.2011, 12:11
1. Потоки.

#include <iostream>

2. Используй C++ Runtime Library

#include <cstdio>

-----
Какой бы из способов ты не выбрал - используй справку и голову.
paradise
06.06.2011, 12:13
в предыдущем посте не был учтен пол

'не выбрал' читать как 'не выбрала'
0 / 0 / 8
Регистрация: 07.12.2010
Сообщений: 46
06.06.2011, 15:03
Привет.
Можно попробовать так:
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
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
 
int main()
{
    const int MAX_BUF = 1024;
 
    std::ifstream f1('1.txt'), f2('2.txt');
    std::ofstream f3('3.txt');
 
    if (!f1.is_open() || !f2.is_open() || !f3.is_open())
    {
        std::cerr << ' ошибка открытия файла(ов)
';
        return -1;
    }
 
    std::vector<std::string> line;
    char buffer[MAX_BUF];
 
    line.reserve(MAX_BUF);
 
    while (!f1.eof())
    {
        f1.getline(buffer, MAX_BUF);
        line.push_back(buffer);
    }
 
    while (!f2.eof())
    {
        f2.getline(buffer, MAX_BUF);
        line.push_back(buffer);
    }
 
    std::random_shuffle(line.begin(), line.end());
 
    for (int i = 0; i < line.size(); i++)
    {
        f3.write(line[i].c_str(), line[i].size());
        f3.put(''); 
    }
 
    f1.close();
    f2.close();
    f3.close();
 
    return 0;
}
Удачи.
0
Silver
07.06.2011, 13:05
А вот примерчик от MFC (упрощен, без обработки
ошибок и т.п.)
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
CStdioFile src1,src2;
CStdioFile dst;
CString str;
 
// откроем 1 файл-источник
src1.Open('c:/source1.txt',CFile::modeRead | CFile::typeText);
// откроем 1 файл-источник
src2.Open('c:/source2.txt',CFile::modeRead | CFile::typeText);
// создадим итоговый файл
dst.Open('c:/destiny.txt',CFile::modeCreate | CFile::typeText);
 
// читаем строку из 1 файла
src1.ReadString(str);
// пишем её в итоговый файл 
dst.WriteString(LPCSTR(str));
 
// читаем строку из 2 файла
src2.ReadString(str);
// пишем её в итоговый файл 
dst.WriteString(LPCSTR(str));
 
// и т.д.
// в конце нужно сделать
src1.Close
src2.Close
dst.Close
laura
07.06.2011, 20:48
Спасибо большое всем за ответы!
А вот как сделать если не два файла надо смешивать, а неизвестное заранее количество?
Это функция должна быть с переменным числом параметров (параметры-имена файлов)?
тогда для переменных-потоков надо массив заводить?
Может как-то проще можно?

np_msn, а почему потоки объявляются как принадлежащие std?
C++
1
2
3
std::ifstream f1('1.txt'), f2('2.txt');  std::ofstream f3('3.txt');
...
std::cerr << ' ошибка открытия файла(ов)';
и еще вот эта сторка непонятна:
C++
1
std::vector<std::string> line;
если не сильно напрягаю, поясните

да, кстати, вот это не работает:
C++
1
if (!f1.is_open() || !f2.is_open() || !f3.is_open())
по-моему надо : if(!f1||!f2||!f3)
paradise
08.06.2011, 11:26
> Это функция должна быть с переменным числом параметров
> (параметры-имена файлов)?

Можно разными способами. Например в качестве параметра передать:
vector<std::string>& names

> тогда для переменных-потоков надо массив заводить?

Можно открывать по одному потоку и считывать все строки в вектор.
Я думаю np_msn использовал два потока (f1,f2) для наглядности. Можно было бы обойтись одним т.к. ввод последовательный (сначала из первого файла, потом из второва).

> Может как-то проще можно?

не делать ничего

> np_msn, а почему потоки объявляются как принадлежащие std?
ifstream и ofstream обьявлены в std. Попробуй убрать std из объявлений

> и еще вот эта сторка непонятна:
> std::vector<std::string> line;
> если не сильно напрягаю, поясните

Вектор строк Имя не очень подходещее - лучше lines. На тему 'что такое вектор' можно почитать Б.Страуструпа или google.com

> да, кстати, вот это не работает:
> if (!f1.is_open() || !f2.is_open() || !f3.is_open())
> по-моему надо :
> if(!f1||!f2||!f3)

Это одно и тоже
0 / 0 / 8
Регистрация: 07.12.2010
Сообщений: 46
08.06.2011, 11:27
Привет.

Цитата laura: 'почему потоки объявляются как принадлежащие std'

Потому что они описаны в пространстве имен std. Можно в начале файла написать:
using namespace std;
тогда не нужно будет явно указывать префикс std.

Цитата laura: 'и еще вот эта сторка непонятна:
std::vector<std::string> line;'

line - это вектор (массив), элементами которого являются строки
std::string, т.е. фактически массив строк.

Цитата laura: 'да, кстати, вот это не работает:
if (!f1.is_open() || !f2.is_open() || !f3.is_open())
по-моему надо :
if(!f1||!f2||!f3)'

У меня стоит Borland C++ Builder 5.01. В нем работают оба варианта.

По поводу множесва входных файлов:
1. можно читать имена файлов из файла
shuffle_string(std::string file_name, std::string out_file);
где file_name - имя файла, где хранятся имена входных файлов,
out_file - имя выходного файла.
2. можно передавать список файлов например через vector или list:
shuffle_string(std::vector<std::string> file_name, std::string out_file);
3. можно в одной строке передать все имена файлов, разделенные пробелами или другими разделителями (например: '1.txt 2.txt 3.txt')
shuffle_string(std::string files, std::string out_file);
Наиболее простой (по-моему) для реализации 2-й способ.
Удачи.
0
paradise
08.06.2011, 11:27
'из второва' читать как 'из второго'
paradise
08.06.2011, 11:28
np_msn, на секунду опаздал
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.06.2011, 11:28
Помогаю со студенческими работами здесь

Заменить в программе, переводящую строку в двоичный код, консольный ввод/вывод на файловый ввод/вывод
Добрый день! Помогите, пожалуйста, с программой. Программа считывает строку с клавиатуры и переводит её в двоичный код. затем наоборот...

Поменять консольный ввод-вывод на файловый ввод-вывод
вот у меня калькулятор как мне сделать что б числа вводились из файла и результат записывался в новый файл ? // ОБРАТНАЯ...

Файловый ввод-вывод, ввод с клавиатуры и обработка массива структур
Добрый вечер)) У меня небольшой вопрос. Почему первые буквы (в названии книг) не выводит на экран? Само задание: О каждой книге ...

Реализовать вывод массива объектов типа Student на консоль (файловый ввод/вывод)
Как сделать чтобы список студентов выводился на экран в конце? #include&lt;iostream&gt; #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; ...

Поиск в массиве структур по заданному полю и вывод в алфавитном порядке (файловый ввод/вывод)
Помогите с функцией void runFile() что бы с файла брал и выводил в алфавитном порядке список товаров, хранящихся больше месяца, стоимость...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru