Как записать файл из потока
Здравствуйте. Мне нужно создать файл и записать в него информацию, для этого нужно использовать многопоточность.
Много читал здесь на форуме, и не только здесь(но все равно плохо понял), получился такой код.
Помощь в написании контрольных, курсовых и дипломных работ здесь
запись string в файл в определенном формате (из Unicode в ASCII. Файл записывать умею)
Здравствуйте. Можете помочь? Записать файл я умею. Но не понимаю как перевести из кодировки.
Запись в файл
Как сделать так, чтоб результат не выводился на экран, а записывался в какой-то файл using System;.
Не совсем. loker просто выступает в роли "флажка" для монопольного "доступа" к обшему ресурсу для рахны потоков.
После этого доступ получает второй поток, и делает абсолютно то же самое что и первый, тем самым дублируя работу, а не выполняя ее паралельно.Второй поток дайти зайдет в lock только после первого, да, но делать ничего не будет т.к. входной поток уже будет прочитан до конца.
В коде есть ошибка - потоки ввода/вывода orignialFileStream, finalFileStream могут закрыться до того как потоки завершат свою работу. Нужно добавить ожидание их завершения внутрь using.
Да, это упражнение. Много где говорят что многопоточность при записи файла не особо полезна, т.к. диск один, и работает медленнее процессора. Хотя кто-то делал поправку, что с ССД-диском вроде бы многопоточность имеетс смысл.
Тогда, что бы у меня два(и более) потока паралельно выполняли задачу мне нужно читать файл частями и потом его так же частями записывать?
Добавлено через 25 минут
Хотя как я понимаю, писать в один файл сразу с двух потоков вроде бы нельзя, т.к. FileStream имеет только один указатель, который и отмечает где мы сейчас находимся. И если второй тред начнет писать в файл, то информация будет просто перемешана в кучу с той, которую пишет первый тред.
Как ты запись потокового аудио на свой компьютер, например музыку, радио и даже учебные файлы? Когда вы сохраняете аудиофайлы в автономном режиме, вы можете слушать их в любое время без ограничений, особенно когда сеть Интернет недостаточно хороша. В статье рассказывается о 4 различных методах захвата потоковых аудиофайлов для легкого захвата нужного файла. Просто узнайте больше подробностей из статьи прямо сейчас.
Часть 1: Профессиональный метод записи потокового аудио
WidsMob Захват - это профессиональный экранный рекордер, позволяющий легко записывать потоковое аудио, звук с микрофона, а также системный звук. Он позволяет с легкостью записывать видео, добавлять файлы с веб-камеры и даже делать снимки. Кроме того, вы также можете дополнительно редактировать видео или добавлять аннотации к записи.
1. Записывайте потоковое аудио с потоковых сайтов в исходном качестве.
2. С легкостью отрегулируйте частоту дискретизации звука, громкость звука и другие параметры.
3. Предварительный просмотр и прослушивание аудиозаписи с помощью встроенного медиаплеера.
4. Нет ограничений по длине аудиозаписи, размеру аудио и т. Д.
5. Поделитесь записанной аудиозаписью в социальных сетях или сохраните на жесткий диск.
Как записывать потоковое аудио по желанию
Шаг 1: Загрузите и установите потоковый аудиорекордер, запустите программу на своем компьютере. Выберите «Экран записи» в домашнем интерфейсе. Щелкните значок «Область экрана» и измените его на X, если вам просто нужно записывать только потоковое аудио.
Шаг 2: Вы можете включить опцию «Аудио» и выбрать другой аудиоканал, который хотите записать. Если вам просто нужно записать файлы онлайн-потоковой передачи, вам следует отключить звук с микрофона или других каналов, чтобы файлы получались без шума.
Шаг 4: Когда потоковое аудио закончится, нажмите кнопку «Стоп», чтобы сохранить аудиофайл на жесткий диск. Перейдите на экран «Медиа-библиотека», и вы можете загрузить потоковую аудиозапись в социальные сети или поделиться видео с друзьями по электронной почте.
Часть 2: Как записывать потоковое аудио бесплатно
Обычно у него есть некоторые недостатки бесплатного потокового аудиомагнитофона, такие как плохое качество звука. Если вы не возражаете против записей, вы можете поделиться двумя бесплатными потоковыми аудиорекордерами ниже.
Метод 1: как записывать потоковое аудио с помощью VLC
VLC Media Player - это медиаплеер с открытым исходным кодом, который предоставляет обширные бонусные функции, включая запись потокового аудио. Он не может оптимизировать качество звука и работает только с общедоступными источниками.
Шаг 1: Загрузите и установите VLC Media Player и запустите программу на своем компьютере. Перейдите в меню «Медиа» и выберите опцию «Открыть сетевой поток», чтобы открыть диалоговое окно мультимедиа.
Шаг 2: Скопируйте и вставьте адрес потокового аудио, которое вы хотите записать, в поле и нажмите кнопку «Воспроизвести». Когда откроется окно проигрывателя, нажмите кнопку «Пауза».
Шаг 3: Перейдите в меню «Просмотр» и отметьте «Дополнительные элементы управления» с несколькими значками, появляющимися внизу. Вы можете начать воспроизведение аудиофайла и нажать кнопку «Запись», чтобы начать запись потокового аудио.
Шаг 4: Когда звук закончится, щелкните значок «Стоп», и медиаплеер VLC сохранит его как файл MP3. После этого вы также можете сохранить аудиофайл на свой компьютер или поделиться в социальных сетях.
Метод 2: как записывать потоковое аудио с Audacity
дерзость это специализированный и универсальный аудиоредактор, имеющий возможность записывать потоковое аудио. Он сохраняет вашу любимую музыку на треках, редактирует аудиофайлы и даже делится файлами записи на сайтах потокового онлайн-вещания.
Шаг 1. Когда вы найдете потоковый аудиофайл, который хотите прослушать в автономном режиме в браузере, откройте Audacity. Нажмите красную кнопку «Запись» в верхнем левом углу и начните воспроизведение потокового аудио.
Шаг 2: В процессе записи вы можете увидеть, как на дорожке появляется волна. В верхнем левом углу есть две полосы громкости. Убедитесь, что звук «Микрофон» закрыт.
Шаг 3: Ваш голос будет записан, и вы сможете отрегулировать громкость звука системы на желаемое. Дождитесь завершения потоковой передачи звука и щелкните значок «Стоп». Теперь вы слушаете аудиофайл на дорожке и редактируете его.
Часть 3: Как записывать потоковое аудио онлайн
Веб-приложения - еще один подход к записи потокового аудио. Это позволяет вам записывать аудиофайл без установки какого-либо программного обеспечения. Просто воспользуйтесь преимуществами какого-нибудь онлайн-диктофона, чтобы получать желаемую музыку и аудио без каких-либо ограничений.
Шаг 1. Когда вы переходите к 123APPS, вы можете выбрать опцию «Диктофон», чтобы записывать потоковое аудио онлайн. Он будет записывать аудиофайлы со всех разных каналов, включая микрофон и системный звук, на ваш компьютер по желанию.
Шаг 2: После этого вы можете начать потоковую передачу звука на своем компьютере. Нажмите красную кнопку микрофона, чтобы записать нужный файл. Он автоматически обнаруживает тихие фрагменты в начале и в конце вашей записи и удаляет их для вашего удобства.
Шаг 3: Конечно, вы также можете выбрать аудиоканалы с помощью значка «Настройки», и после завершения записи вы можете обрезать записанное потоковое аудио до нужного раздела. После этого вы можете сохранить запись на свой компьютер или поделиться в социальных сетях.
Заключение
В статье рассказывается о 4 различных методах записи потокового аудио на ПК или MacBook. Потоковое аудио предназначено для прослушивания онлайн. Вы не можете наслаждаться этим в автономном режиме. YouTube, Spotify и другие платформы не предоставляют возможность загрузки из-за положений об авторских правах. Но вы все равно можете получить их на свой жесткий диск с помощью онлайн-рекордера экрана, такого как WidsMob Capture. Он не только прост в использовании, но и может с легкостью создавать высококачественный выходной аудиофайл.
Работа с файлами с использованием конструкций языка Си была рассмотрена здесь.
Для программиста открытый файл представляется как последовательность считываемых или записываемых данных. При открытии файла с ним связывается поток ввода-вывода . Выводимая информация записывается в поток, вводимая информация считывается из потока.
Для работы с файлами необходимо подключить заголовочный файл <fstream> . В нем определены несколько классов и подключены заголовочные файлы
Файловый ввод-вывод аналогичен стандартному вводу-выводу, единственное отличие – это то, что ввод-вывод выполнятся не на экран, а в файл.
Если ввод-вывод на стандартные устройства выполняется с помощью объектов cin и cout , то для организации файлового ввода-вывода достаточно создать собственные объекты, которые можно использовать аналогично этим операторам.
При работе с файлом можно выделить следующие этапы:
- создать объект класса fstream (возможно, ofstream или ifstream );
- связать объект класса fstream с файлом, который будет использоваться для операций ввода-вывода;
- осуществить операции ввода-вывода в файл;
- закрыть файл.
В результате будет создан файл
Режимы открытия файлов устанавливают характер использования файлов. Для установки режима в классе ios предусмотрены константы, которые определяют режим открытия файлов.
Константа | Описание |
ios::in | открыть файл для чтения |
ios::out | открыть файл для записи |
ios::ate | при открытии переместить указатель в конец файла |
ios::app | открыть файл для записи в конец файла |
ios::trunc | удалить содержимое файла, если он существует |
ios::binary | открытие файла в двоичном режиме |
Режимы открытия файлов можно устанавливать непосредственно при создании объекта или при вызове метода open() .
ofstream fout( "file.txt" , ios::app);fout.open( "file.txt" , ios::app);
Режимы открытия файлов можно комбинировать с помощью поразрядной логической операции ИЛИ | , например:
ios::out | ios::in - открытие файла для записи и чтения.
Произвольный доступ к файлу
Система ввода-вывода С++ позволяет осуществлять произвольный доступ с использованием методов seekg() и seekp() .
- ifstream &seekg(Смещение, Позиция);
- ofstream &seekp(Смещение, Позиция);
Смещение определяет область значений в пределах файла ( long int ).
Система ввода-вывода С++ обрабатывает два указателя, ассоциированные с каждым файлом:
- get pointer g - определяет, где именно в файле будет производиться следующая операция ввода;
- put pointer p - определяет, где именно в файле будет производиться следующая операция вывода.
Позиция смещения определяется как
Позиция | Значение |
ios::beg | Начало файла |
ios::cur | Текущее положение |
ios::end | Конец файла |
Всякий раз, когда осуществляются операции ввода или вывода, соответствующий указатель автоматически перемещается.
С помощью методов seekg() и seekp() можно получить доступ к файлу в произвольном месте.
Можно определить текущую позицию файлового указателя, используя следующие функции:
- streampos tellg() - позиция для ввода
- streampos tellp() - позиция для вывода
В результате выполнения первой части программы будет создан файл
Вторая часть программы выведет в консоль
Ещё один пример. Допустим, нам нужно заполнять таблицу
Причем каждая вновь введенная строка должна размещаться в таблице непосредственно под "шапкой".
Алгоритм решения задачи следующий:
- формируем очередную строку для вывода
- открываем файл для чтения, считываем из него данные и сохраняем их в массив строк
- закрываем файл
- открываем файл для записи
- выводим "шапку" таблицы
- выводим новую строку
- выводим все сохраненные строки обратно в файл, начиная со строки после шапки
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
fstream inOut;
inOut.open( "file.txt" , ios::in); // открываем файл для ввода
// Считываем из файла имеющиеся данные
int count = 0;
while (inOut.getline(line[count], 100)) count++;
inOut.close(); // закрываем файл
Результат выполнения:
Полученный файл данных:
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 import static java.lang.System.out;
import java.util.Arrays;
class Combinations
private static final int M = 12;
private static final int N = 24;
private static int [] generateCombinations( int [] arr)
if (arr == null)
arr = new int [M];
for ( int i = 0; i < M; i++)
arr[i] = i + 1;
return arr;
>
for ( int i = M - 1; i >= 0; i--)
if (arr[i] < N - M + i + 1)
arr[i]++;
for ( int j = i; j < M - 1; j++)
arr[j + 1] = arr[j] + 1;
return arr;
>
return null;
>
public static void main(String args[])
int [] arr = null;
while ((arr = generateCombinations(arr)) != null)
out.println(Arrays.toString(arr));
>
>
В настройках консоли (меню в верхнем левом углу) изменить размер буфера Думаю, что "в правильную". Можно попробовать взять, например, среднее арифметическое для каждой точки из двух файлов. Но это нужно анализировать при отладке. Елена, здравствуйте, с вами можно как-то связаться, помимо того как здесь в комментариях? Можно через форму обратной связи на сайте или через ВК Елена, здравствуйте. Подскажите, пожалуйста, как можно сделать так, чтобы из первой строки файла считывался размер массива, а из второй - его элементы, количество которых равно значению из первой строки. Не нашла у вас на сайте ничего про построчный ввод из файла. Заранее спасибо. Ввод из файла осуществляется аналогично консольному вводу. После считывания порции данных указатель позиции файла автоматически перемещается на ее конец. Да, но у вас в статьях нет ничего про, к примеру, getline. По вашим статьям я изучаю практически все, очень понятно и доходчиво написано, но этот блок то ли я не могу найти, то ли его нет. Подскажите, у вас на сайте есть статья, где более подробно описывается файловый ввод и вывод? Здравствуйте, попыталась сделать вывод данных в файл, но почему то только создался документ, а данных там нет. Что не так?
ofstream fout( "file.txt" , ios::out);
fout.open( "file.txt" , ios::out);
for ( int i = 0; i < SIZE; i++)
for ( int j = 0; j < SIZE; j++)
printf( "%5d " , a[i][j]);
printf( "\n" );
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 надо сделать типа чтобы еще можно было добавить людей в список и выровнять это все Почему файл объявлен как поток вывода, а открывается для ввода? Чему равен count? Где тут люди? Почему при вводе нет цикла? 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
Под вводом-выводом в программировании понимается процесс обмена информацией между оперативной памятью и внешними устройствами: клавиатурой, дисплеем, магнитными накопителями и т. п. Ввод — это занесение информации с внешних устройств в оперативную память, а вывод — вынос информации из оперативной памяти на внешние устройства. Такие устройства, как дисплей и принтер, предназначены только для вывода; клавиатура — устройство ввода. Магнитные накопители (диски, ленты) используются как для ввода, так и для вывода.
Основным понятием, связанным с информацией на внешних устройствах ЭВМ, является понятие файла. Всякая операция ввода-вывода трактуется как операция обмена с файлами: ввод — это чтение из файла в оперативную память; вывод — запись информации из оперативной памяти в файл. Поэтому вопрос об организации в языке программирования ввода-вывода сводится к вопросу об организации работы с файлами.
Внутренний файл — это переменная файлового типа, являющаяся структурированной величиной. Элементы файловой переменной могут иметь разный тип и, соответственно, разную длину и форму внутреннего представления. Внутренний файл связывается с внешним (физическим) файлом с помощью стандартной процедуры Assign. Один элемент файловой переменной становится отдельной записью во внешнем файле и может быть прочитан или записан с помощью одной команды. Попытка записать в файл или прочитать из него величину, не совпадающую по типу с типом элементов файла, приводит к ошибке.
Аналогом понятия внутреннего файла в языках Си/Си++ является понятие потока. Поток — это байтовая последовательность, передаваемая в процессе ввода-вывода.
Поток должен быть связан с каким-либо внешним устройством или файлом на диске. В терминологии Си это звучит так; поток должен быть направлен на какое-то устройство или файл.
Основные отличия файлов в Си состоят в следующем: здесь отсутствует понятие типа файла и, следовательно, фиксированной структуры записи файла. Любой файл рассматривается как байтовая последовательность:
Стрелочкой обозначен указатель файла, определяющий текущий байт файла. EOF является стандартной константой — признаком конца файла.
Существуют стандартные потоки и потоки, объявляемые в программе. Последние обычно связываются с файлами на диске, создаваемыми программистом. Стандартные потоки назначаются и открываются системой автоматически. С началом работы любой программы открываются 5 стандартных потоков, из которых основными являются следующие:
o stdin — поток стандартного ввода (обычно связан с клавиатурой);
o stdout — поток стандартного вывода (обычно связан с дисплеем);
Кроме этого, открывается поток для стандартной печати и дополнительный поток для последовательного порта.
Работа с файлами на диске. Работа с дисковым файлом начинается с объявления указателя на поток. Формат такого объявления:
Слово file является стандартным именем структурного типа, объявленного в заголовочном файле stdio.h. В структуре file содержится информация, с помощью которой ведется работа с потоком, в частности: указатель на буфер, указатель (индикатор) текущей позиции в потоке и т.д.
Следующий шаг — открытие потока, которое производится с помощью стандартной функции fopen (). Эта функция возвращает конкретное значение для указателя на поток и поэтому ее значение присваивается объявленному ранее указателю. Соответствующий оператор имеет формат:
Имя_указателя=fореn (“имя_файла”, “режим_открытия”) ;
Параметры функции fopen () являются строками, которые могут быть как константами, так и указателями на символьные массивы. Например:
Здесь test .dat — это имя физического файла в текущем каталоге диска, с которым теперь будет связан поток с указателем fр. Параметр режима r означает, что файл открыт для чтения. Что касается терминологии, то допустимо употреблять как выражение «открытие потока», так и выражение «открытие файла».
Существуют следующие режимы открытия потока и соответствующие им параметры:
r открыть для чтения
w создать для записи
а открыть для добавления
r+ открыть для чтения и записи
w+ создать для чтения и записи
а+ открыть для добавления или
создать для чтения и записи
Поток может быть открыт либо для текстового, либо для двоичного (бинарного) режима обмена.
Понятие текстового файла: это последовательность символов, которая делится на строки специальными кодами — возврат каретки (код 13) и перевод строки (код 10). Если файл открыт в текстовом режиме, то при чтении из такого файла комбинация символов «возврат каретки — перевод строки» преобразуется в один символ \n — переход к новой строке.
При записи в файл осуществляется обратное преобразование. При работе с двоичным файлом никаких преобразований символов не происходит, т.е. информация переносится без всяких изменений.
Указанные выше параметры режимов открывают текстовые файлы. Если требуется указать на двоичный файл, то к параметру добавляется буква b. Например: rb, или « b », или r +b. В некоторых компиляторах текстовый режим обмена обозначается буквой t, т.е. записывается a+t или rt.
Если при открытии потока по какой-либо причине возникла ошибка, то функция fopen() возвращает значение константы null. Эта константа также определена в файле stdio.h. Ошибка может возникнуть из-за отсутствия открываемого файла на диске, нехватки места в динамической памяти и т.п. Поэтому желательно контролировать правильность прохождения процедуры открытия файла. Рекомендуется следующий способ открытия:
if (fp=fopen("test.dat", "r")==NULL)
В случае ошибки программа завершит выполнение с закрытием всех ранее открытых файлов.
Закрытие потока (файла) осуществляет функция fclose(), прототип которой имеет вид:
int fclose(FILE *fptr);
Здесь fptr обозначает формальное имя указателя на закрываемый поток. Функция возвращает ноль, если операция закрытия прошла успешно. Другая величина означает ошибку.
Запись и чтение символов. Запись символов в поток производится функцией putc() с прототипом
int putc (int ch, FILE *fptr);
Если операция прошла успешно, то возвращается записанный символ. В случае ошибки возвращается константа EOF.
Считывание символа из потока, открытого для чтения, производится функцией gets () с прототипом
int gets (FILE *fptr);
Функция возвращает значение считываемого из файла символа. Если достигнут конец файла, то возвращается значение EOF. Заметим, что это происходит лишь в результате чтения кода EOF.
Исторически сложилось так, что gets() возвращает значение типа int. To же можно сказать и про аргумент ch в описании функции puts(). Используется же в обоих случаях только младший байт. Поэтому обмен при обращении может происходить и с переменными типа char.
Пример 1. Составим программу записи в файл символьной последовательности, вводимой с клавиатуры. Пусть признаком завершения ввода будет символ *.
Читайте также: