Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
_д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 35
#1

файл целых чисел - C++

21.08.2011, 19:31. Просмотров 786. Ответов 12
Метки нет (Все метки)

Дан файл целых чисел. Нулевых компонентов файле нет. Число отрицательных компонентов равно числу полжительных. Преобразовать файл таким образом, чтобы сначала были положительные числа, а затем отрицательные. Порядок следования как положительных, так и отрицательных чисел сохранить.
Буду признателен если поможете сделать это на Си. Заранее спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
21.08.2011, 19:42     файл целых чисел #2
должно работать
C++
1
2
3
4
for (int i=0;i<n;i++)
    if (a[i]>0) cout << a[i] << endl;
for (int i=0;i<n;i++)
    if (a[i]<0) cout << a[i] << endl;
а массив чисел а n размер массива.
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
21.08.2011, 20:51     файл целых чисел #3
Цитата Сообщение от _д_м_и_т_р_и_й_ Посмотреть сообщение
Дан файл целых чисел...
А вы не бизнесом случаем занимаетесь? Мы вам решаем, а вы потом все сплавляете. Ну как так, где ваши наработки? А мы поможем
diagon
Higher
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
21.08.2011, 21:03     файл целых чисел #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <fstream>
#include <vector>
#include <algorithm>
#include <iterator>
bool is_positive( int n ) { return n > 0; }
bool is_negative( int n ) { return n < 0; }
int main(){
    std::fstream file("input.txt", std::ios::in);
    std::vector<int> arr;
    std::copy( std::istream_iterator<int> (file), std::istream_iterator<int> (), std::back_inserter(arr) );
    file.close();
    file.open("input.txt", std::fstream::out);
    std::remove_copy_if(arr.begin(), arr.end(), std::ostream_iterator<int> (file, " "), is_positive);
    std::remove_copy_if(arr.begin(), arr.end(), std::ostream_iterator<int> (file, " "), is_negative);
}
Код
diagon@shadeware:~$ cat input.txt && ./a.out && cat input.txt
1 -2 3 -4 5 -6 7
-2 -4 -6 1 3 5 7 
diagon@shadeware:~$
Тьфу, у меня сначала отрицательные идут, затем положительные...
Поменяйте 14 и 15 строчки =)
Ай, на си же... Извиняюсь.
_д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 35
21.08.2011, 21:08  [ТС]     файл целых чисел #5
нет, я просто студент, с небольшей задолжностью по программированию, извините что обращаюсь, просто сроки поджимают, поэтому пока разбираюсь с одним, хотелось найти решение другого задания. еще раз приношу свои извинения за то что прошу вашей помощи.
diagon
Higher
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
21.08.2011, 21:23     файл целых чисел #6
На си как-то так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#define MAXSIZE 1024
int main(){
    int arr[MAXSIZE];
    FILE *file = fopen("input.txt", "r");
    int i = 0;
    while ( fscanf(file, "%d", &arr[i++] ) != EOF );
    file = fopen("input.txt", "w");
    for (int j = 0; j < i; ++j)
        if (arr[j] > 0)
            fprintf(file, "%d ", arr[j]);
    for (int j = 0; j < i; ++j)
        if (arr[j] < 0)
        fprintf(file, "%d ", arr[j]);
        
}
Bash
1
2
3
diagon@shadeware:~$ cat input.txt && ./a.out && cat input.txt
1 -2 3 -4 5 -6 7
1 3 5 7 -2 -4 -6
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
21.08.2011, 21:41     файл целых чисел #7
вариант без массивов:

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
#include<stdio.h>
 
int Transform(char *fname)
{
   FILE *f, *g;
   char tmpname[300];
   int x;
   tmpnam(tmpname);
   rename(fname, tmpname);
   if ((f = fopen(tmpname, "rt")) == NULL)
      return 1;
   if ((g = fopen(fname, "wt")) == NULL)
      return 1;
   while (fscanf(f, "%d", &x) != EOF)
      if (x > 0)
         fprintf(g, "%d ", x);
   rewind(f);
   while (fscanf(f, "%d", &x) != EOF)
      if (x < 0)
         fprintf(g, "%d ", x);
  fclose(f);
  fclose(g);
  remove(tmpname);
  return 0;
}
 
int main()
{
   Transform("c:\\a.txt");
   return 0;
}
Добавлено через 4 минуты
Diagon, не забывайте потоки закрывать. Это ОЧЕНЬ важно!
diagon
Higher
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
21.08.2011, 21:46     файл целых чисел #8
Цитата Сообщение от Olga_ Посмотреть сообщение
Diagon, не забывайте потоки закрывать. Это ОЧЕНЬ важно!
А зачем их закрывать в данном случае?
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
21.08.2011, 21:49     файл целых чисел #9
Цитата Сообщение от diagon Посмотреть сообщение
А зачем их закрывать в данном случае?
Сложится у вас привычка и потом в других задачах вы вдруг обнаружите, что в файл не все записалось. Все же это признак хорошего тона, когда всегда потоки закрываются.
grizlik78
Эксперт С++
1897 / 1429 / 106
Регистрация: 29.05.2011
Сообщений: 2,985
21.08.2011, 21:52     файл целых чисел #10
Особо занудные могут ещё сказать, что потоки (Си) не только закрывать надо, но ещё и проверять значение, возвращаемое fclose(). Сам я этого никогда не делаю, но только тссс!
-=ЮрА=-
Заблокирован
Автор FAQ
21.08.2011, 21:55     файл целых чисел #11
Вот моя реализация, я расширил в файле числа могут быть дабл, алгоритм оттестирован и полностью работоспособен!Выполнял в функциях Си
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <windows.h>//malloc, realloc
#include <stdlib.h> //atof
#include <stdio.h>  //printf, FILE
#include <conio.h>  //getch
 
int main()
{
    long n,i;
    FILE * f;
    char * str,*buf;
    double * mass = (double *)malloc(sizeof(double));
    if(!(f = fopen("data.txt","rb+")))
        printf("ERROR ACCESS to READ [data.txt]\r\n");
    else
    {
        fseek(f,0,SEEK_END);
        n = ftell(f);
        fseek(f,0,SEEK_SET);
        if(!(str = (char *)malloc(n + 1)))
            printf("ERROR ALLOCATION MEMORY\r\n");
        else
        {
            fread(str,1,n,f);
            fclose(f);
            str[n] = '\0';
            n = 0;
            buf = strtok(str," ,\n");//Числа могут идти через пробел, запятую или с новой строки
            while(buf)
            {
                mass[n] = atof(buf);
                buf = strtok(NULL," ,\n");
                mass = (double *)realloc(
                    (void *)mass,
                    (1 + (n = n + 1))*sizeof(double));
            }
            free(str);//Чистим память
            if(!(f = fopen("data.txt","w")))
                printf("ERROR ACCESS to WRITE [data.txt]\r\n");
            else
            {
                for(i = 0; i < n; i++)
                {
                    if(mass[i] < 0)
                    {
                        fprintf(f,"%.3f ",mass[i]);//Точность вывода 3 знака после запятой
                        printf("%.3f ",mass[i]);
                    }
                }
                for(i = 0; i < n; i++)
                {
                    if(0 <= mass[i])
                    {
                        fprintf(f,"%.3f ",mass[i]);//Точность вывода 3 знака после запятой
                        printf("%.3f ",mass[i]);
                    }
                }
                printf("\r\nWRITING DATA IN [data.txt] DONE\r\n");
            }
        }
        fclose(f);
    }
    printf("Press any key to continue\r\n");
    getch();
    return 0;
}
Вложения
Тип файла: txt data.txt (15.5 Кб, 9 просмотров)
_д_м_и_т_р_и_й_
0 / 0 / 0
Регистрация: 11.02.2011
Сообщений: 35
21.08.2011, 21:55  [ТС]     файл целых чисел #12
огромное спасибо за помощь, извините что отвлекаю своими заданиями. и еще вопрос, почему у вас статус "нарушитель"?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2011, 21:59     файл целых чисел
Еще ссылки по теме:

Записать в двоичный файл n случайных целых чисел C++
C++ Задан файл из целых чисел со знаком, разделенных пробелом. Произвести чтение этих чисел в обратном порядке, не читая предыдущие.
C++ Создать файл целых чисел содержащий сумму чисел из каждой строки исходной таблицы
Создать файл, в который записать n целых чисел C++
C++ Дописать в файл пять введенных пользователем целых чисел

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

Или воспользуйтесь поиском по форуму:
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
21.08.2011, 21:59     файл целых чисел #13
Цитата Сообщение от grizlik78 Посмотреть сообщение
Особо занудные могут ещё сказать, что потоки (Си) не только закрывать надо, но ещё и проверять значение, возвращаемое fclose().
Пока это учебные задачи, а так, конечно, надо. Но, как минимум, без fclose() никуда (или fflush()).

Добавлено через 3 минуты
Цитата Сообщение от _д_м_и_т_р_и_й_ Посмотреть сообщение
огромное спасибо за помощь, извините что отвлекаю своими заданиями. и еще вопрос, почему у вас статус "нарушитель"?
Во первых, ничего страшного, еще бы вы это освоили, было бы здорово, в таком случае помочь одно удовольствие.
А "нарушитель" за желание помочь - ссылки на хорошие книги выкладывала, а, оказалось, так нельзя
Yandex
Объявления
21.08.2011, 21:59     файл целых чисел
Ответ Создать тему
Опции темы

Текущее время: 11:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru