Как заполнить файл числами

Обновлено: 03.07.2024

Я прикинул предварительный план решения и составил 3 пункта:

1) (То, что я незнаю как реализовать.): Читаем *.txt файл chisla и выделяем из этого файла все вещественные числа стоящие
через пробел (пример файла : "234432.324422 565463.4353 2425654.478".. и т.д.) Записываем по порядку каждое число в новый
динамический массив chisla, размер массива = числу чисел из файла.
2) Находим среднее значение всех чисел используя массив, это я могу сделать.
3) Выводим на экран все элементы массива, меньшие чем их среднее значение. Это я тоже могу реализовать.

Заранее спасибо за любую помощь.


1) (То, что я незнаю как реализовать.): Читаем *.txt файл chisla и выделяем из этого файла все вещественные числа стоящие
через пробел (пример файла : "234432.324422 565463.4353 2425654.478".. и т.д.) Записываем по порядку каждое число в новый
динамический массив chisla, размер массива = числу чисел из файла.
.

Это ты с числами решил общаться как со строками? Почему не с бинарным файлом, а именно с текстровым?

Ммм. если я что-то говорю не так, то прошу прощения.
Опыта работы с файлами в си ранее не имел. да не, все так, это твоя мысля и твое право работать с числами и файлами так, как захочется. Просто удобнее было бы на мой взгляд забить в бинарный файл числа типа long long, чтобы на все хватило, и затем читать их. Иначе тебе придется парсить строку, выковыривая числа, и затем юзать нечто вроде strtoint. На мой взгляд, если задача не критична, лучше юзать блочные чтение/запись бинарного файла. Вот небольшой примерчик

int main( void )
int count
long long array1[SIZE], array2[SIZE];
FILE *fp;

// забиваем массив 1 числами 0,1,2,4. 38
for (count = 0; count < SIZE; count++)
array1[count] = (long long) (2 * count);

// открываем бинарный файл
if ( (fp = fopen("file.bin", "wb")) == NULL)
fprintf(stderr, "Error opening file.");
exit(1);
>

// сохраняем в файл первый массив
// fwrite (void *buff, int size, int count, FILE *fp)
// buff - указатель на память, которую пишем
// size - размер отдельных элементов
// count - число элементов
if (fwrite(array1, sizeof(long long), SIZE, fp) != SIZE)
fprintf(stderr, "Error writing to file.");
exit(1);
>

// Открываем файл на чтение
if ( (fp = fopen("file.bin", "rb")) == NULL)
fprintf(stderr, "Error opening file.");
exit(1);
>

// Читаем файл в массив 2
if (fread(array2, sizeof(long long), SIZE, fp) != SIZE)
fprintf(stderr, "Error reading file.");
exit(1);
>

// Во втором массиве должны быть полученные данные, выводи их, сверяй и т.д.

. Просто удобнее было бы на мой взгляд забить в бинарный файл числа типа long long, чтобы на все хватило, и затем читать их. Иначе тебе придется парсить строку, выковыривая числа, и затем юзать нечто вроде strtoint. На мой взгляд, если задача не критична, лучше юзать блочные чтение/запись бинарного файла.


Зачем создавать бинарный файл,когда по условию файл дан ? В нем находятся какие то числа.Массив стоит сделать 2-мерный(или числа в файле идут в одну строку ? Вряд ли).Ничего не надо выковыривать,никакого stroint( ? ).Все проще.Я делаю единственное допущение,что в первой строке файла записан размер массива и мы его считываем(облом считать:) ).Далее читаем весь массив.

вот собственно сама программа, тут требуется зарандомить 5 файлов действительными числами и потом поменять их компоненты. проблема в том, что у меня рандом делается только 1 раз и компоненты всех файлов равны, а мне нужны 5 файлов с разным содержанием, что нужно изменить в программе?

uses crt;
type fail=file of real;
procedure WriteFile(var f:fail;name:string);
const n=3;
var r:real;
c:char;
i:integer;
begin
assign(f,name);
rewrite(f);
randomize;
for i:=1 to n do begin
r:=(random(50)+1)/(random(100)+1);
write(f,r);
end;
clrscr;
close(f);
end;
procedure ReadFile(var f:fail;name:string);
var r:real;
begin
writeln(' Файл ',name);
reset(f);
while not eof(f) do
begin
read(f,r);
write(r:0:2,' ');
end;
writeln;
close(f);
end;
procedure CopyFile(var f,g:fail);
var r:real;
begin
reset(f);
rewrite(g);
while not eof(f) do
begin
read(f,r);
write(g,r);
end;
close(g);
close(f);
end;
var f1,f2,f3,f4,f5,h:fail;
begin
assign(f1,'file1');
rewrite(f1);
assign(f2,'file2');
rewrite(f2);
assign(f3,'file3');
rewrite(f3);
assign(f4,'file4');
rewrite(f4);
assign(f5,'file5');
rewrite(f5);
assign(h,'fileh');
rewrite(h);
clrscr;
WriteFile(f1,'File1');
WriteFile(f2,'File2');
WriteFile(f3,'File3');
WriteFile(f4,'File4');
WriteFile(f5,'File5');
writeln('Содержание исходных файлов: ');
ReadFile(f1,'File1');
ReadFile(f2,'File2');
ReadFile(f3,'File3');
ReadFile(f4,'File4');
ReadFile(f5,'File5');
CopyFile(f3,h);
CopyFile(f1,f3);
CopyFile(h,f5);
CopyFile(f4,h);
CopyFile(f2,f4);
CopyFile(h,f1);
writeln('Содержание измененных файлов: ');
ReadFile(f1,'File1');
ReadFile(f2,'File2');
ReadFile(f3,'File3');
ReadFile(f4,'File4');
ReadFile(f5,'File5');
erase(h);
readln;
end.

у меня все значения разные, randomize поставь первой командой после BEGINa

Добрый вечер форумчане, у меня появился новый вопрос для вас, связанный с джавой.
Задание: "Создать и заполнить файл случайными целыми числами. Отсортировать содержимое файла по возрастанию."
Вот есть примерный код, но он вообще не компилируемый.
Может кто чем нибудь помочь, шарящие. Я в тупике.
package filehomework;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;

public class FILEHomeWork

public static void main(String[] args) throws FileNotFoundException, IOException

int a[] = new int[10];
Random random = new Random();
for (int i = 0; i < 10; i++) a[i] = random.nextInt(100) - 50;
>

for (int i = 0; i < 10; i++) System.out.print(a[i] + " ");
>

System.out.println("Отсортированный массив: \n");

int i = 0, j, x;
for (j = 0; j < 10; j++) for (i = 0; i < 10 - j - 1; i++) if (a[i] < a[1 + i]) x = a[i];
a[i] = a[1 + i];
a[1 + i] = x;

try int size;
try (InputStream f1 = new FileInputStream("esep.text") size = f1.available();
byte buffer[] = new byte[size];

f1.write (a
[i]);
String s = new String(a);

import java.util.Random;
import java.util.Arrays;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class Main

private static final int COUNT_OF_NUMBERS = 100;

public static void main(String[] args) Random random = new Random();
File file = new File("random_numbers.txt");
int[] randomNumbers = new int[COUNT_OF_NUMBERS];

// Заполняем массив случайными числа
for (int i = 0; i < COUNT_OF_NUMBERS; i++) randomNumbers[i] = random.nextInt(100);
>

// Записываем в файл
try (FileWriter writer = new FileWriter(file)) for (int i = 0; i < COUNT_OF_NUMBERS; i++) writer.write(randomNumbers[i] + " ");
>
> catch (IOException e) e.printStackTrace();
>


Но тут есть еще один нюанс, я через онлайн компилятор решил попробовать, точно так же пусто, но в разделе random_numbers.txt всё появилось, в оригинальном компиляторе такого раздела почему то не нашел, хотя эти цифры должны появляться в зоне компилирования, странно конечно.
Паскаль. Заполнить файл случайными целыми числами. Определить, сколько различных компонентов находится в файле. Заполнить файл целыми числами, полученными с помощью генератора случайных чисел. Определить, сколько различных компонентов находится в файле. Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Var
i,k,m,n:integer;
f:file of integer;
begin
randomize;
Assign(F,'MyFile1.dat');
writeln('Введите количество целых чисел');
readln(n);
For i:=1 to n do
write(f, random(10));
close(f);


не знаю, но может начало такое.

Для меня не очевидна версия Паскаля.
Если это типа ТР7.0 или FPC, то следует писАть в файл процедурой
Writeln(), а читать - процедурой Readln().
Если диапазон генерируемых целых чисел определен и не велик, как например в примере random(10), то можно читать числа из файла и использовать их как индекс в массиве.
В этом случае в элементе массива можно подсчитывать кол-во одинаковых чисел простым инкрементом. После просмотра массива можно получить информацию о количестве разных чисел.
Внимание, если в генерации есть нули, то массив, перед использованием, следует заполнить некоторым отрицательным/положительным значением, что позволит определить элементы массива в которых подсчет не велся (в массиве целых чисел такие значения отсутствуют).
В другом случае, когда число генерируемых чисел не велико, можно прочитать числа из файла в массив и отсортировать их. Затем выполнить подсчет отличающихся чисел.
В худшем случае придется делать сортировку через файлы.

Для меня не очевидна версия Паскаля.
Если это типа ТР7.0 или FPC, то следует писАть в файл процедурой
Writeln(), а читать - процедурой Readln().
Если диапазон генерируемых целых чисел определен и не велик, как например в примере random(10), то можно читать числа из файла и использовать их как индекс в массиве.
В этом случае в элементе массива можно подсчитывать кол-во одинаковых чисел простым инкрементом. После просмотра массива можно получить информацию о количестве разных чисел.
Внимание, если в генерации есть нули, то массив, перед использованием, следует заполнить некоторым отрицательным/положительным значением, что позволит определить элементы массива в которых подсчет не велся (в массиве целых чисел такие значения отсутствуют).
В другом случае, когда число генерируемых чисел не велико, можно прочитать числа из файла в массив и отсортировать их. Затем выполнить подсчет отличающихся чисел.
В худшем случае придется делать сортировку через файлы.

Читайте также: