Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2009, 12:44   #1
mertl
Новичок
Джуниор
 
Регистрация: 09.09.2009
Сообщений: 6
По умолчанию C++ fgets

Всем привет. Нужна помощь, пытаюсь написать программу, которая читает числа из файла и сортирует их. Проблема в том, что ф-ция fgets помещает числа в массив посимвольно (т.е. не 63 56 89, а 6 3 5 6 8 9 (вроде)). Как мне это исправить?


Код:
#include "stdafx.h"
#include <stdio.h>

FILE *stream;

int main( void )
{
   char s[81];
  
   int q,i,j;

   if( fopen_s( &stream, "C://Users/.../1.txt", "r" ) != 0 )
      printf( "The file 1.txt was not opened\n" );
   else
   {
      if( fgets( s, 81, stream ) == NULL)
         printf( "fgets error\n" );
	  else

		  printf( "%s", s);

      fclose( stream );
   }
for (i=0;i<4;i++) // сортировка
{for (j=0;j<4;j++)
{if(s[j]<s[j+1])
{q=s[j];
s[j]=s[j+1];
s[j+1]=q;
}
}
}
printf("\n");
for (i=0;i<4;i++)
{ 
 printf("%c ",s[i]);
}

Последний раз редактировалось Stilet; 09.09.2009 в 13:04.
mertl вне форума Ответить с цитированием
Старый 09.09.2009, 13:02   #2
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Код:
char s[81];
а чего ты ждал от него? Char предназначен для хранения символов, а не чисел. Заведи другой массив.
Например:
Код:
int s[81]
Код:
if( fgets( s, 81, stream ) == NULL)
printf( "fgets error\n" );
А вообще меня вот такая вот запись пугает, неужели это работает?
mMAg вне форума Ответить с цитированием
Старый 09.09.2009, 13:06   #3
mertl
Новичок
Джуниор
 
Регистрация: 09.09.2009
Сообщений: 6
По умолчанию

ну вообще fgets - Get a string from a stream. как я смогу int написать?
да, работает
mertl вне форума Ответить с цитированием
Старый 09.09.2009, 13:07   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А через ifstream не хочешь попробовать читать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.09.2009, 13:11   #5
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Цитата:
Сообщение от mertl Посмотреть сообщение
ну вообще fgets - Get a string from a stream. как я смогу int написать?
да, работает
Заведи массив интов, забей на fgets и читай из файла в этот массив оператором <<. Заведи ifstream, последуй предыдущему совету.

А то что у тебя сейчас написано, это вообще не из той оперы. Ты просто строку одну считал.
mMAg вне форума Ответить с цитированием
Старый 09.09.2009, 13:49   #6
mertl
Новичок
Джуниор
 
Регистрация: 09.09.2009
Сообщений: 6
По умолчанию

попробовал через ifstream, тоже самое числа 67 и 45, сортирует как 7 6 5 4
mertl вне форума Ответить с цитированием
Старый 09.09.2009, 14:09   #7
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Кинь код того, что ты там исправил.
Ты все еще сортируешь массив charов? Не удивительно, что она так работает. Тебе числа нужно сортировать, или символы, из которых эти числа состоят? Если числа, то без массива чисел тебе не обойтись, а в том коде у тебя есть лишь массив символов.
mMAg вне форума Ответить с цитированием
Старый 09.09.2009, 14:19   #8
mertl
Новичок
Джуниор
 
Регистрация: 09.09.2009
Сообщений: 6
По умолчанию

Код:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[])
{
  ifstream in("C:/.../1.txt");

  if(!in) 
  {
    cout << "Cannot open input file.\n";
    return 1;
  }

  char str[255];
  int q,i,j;

  while(in) 
  {
    in.getline(str, 255); 
    if(in) cout << str << endl;
  }

  in.close();
  
  for (i=0;i<5;i++)
{for (j=0;j<5;j++)
{if(str[j]<str[j+1])
{q=str[j];
str[j]=str[j+1];
str[j+1]=q;
}
}
}
printf("\n");
for (i=0;i<5;i++)
{ 
 printf("%c ",str[i]);
}

  return 0;

  
}
сорри, не выделяется тэгом
да, нужно сортировать числа

Последний раз редактировалось Stilet; 09.09.2009 в 14:52.
mertl вне форума Ответить с цитированием
Старый 09.09.2009, 14:40   #9
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Код:
char str[255];
int q,i,j;

while(in) 
{
in.getline(str, 255); 
if(in) cout << str << endl;
}
Код:
int str[255];
int q,i,j;
i = 0;
while(!in.eof()) 
{
str[i] << in;
i++;
}
Мне лень загружать среду, но суть, я думаю, ясна. Пока ты работаешь с массивом символов, то символы же ты и сортируешь. Как только станешь работать с массивом чисел, будешь сортировать числа. А если так хочется считывать в массив charов, то тебе прийдется потом из строки сделать массив Чисел. Тебе тогда в соседнюю тему.
mMAg вне форума Ответить с цитированием
Старый 09.09.2009, 14:56   #10
mertl
Новичок
Джуниор
 
Регистрация: 09.09.2009
Сообщений: 6
По умолчанию

А можно сразу считывать из файла в массив интов? пытался написать int s[81], компилятор сразу заругался
mertl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с функциями fgets (), fputs() Volchara Общие вопросы C/C++ 6 05.04.2009 22:09