Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение из файла, нужна небольшая помощь 
:(
    Опции темы
PunkRat
Дата 20.1.2003, 01:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Помогите пожалуйста, кому не ленm :) В общем всё просто. Есть текстовый файл, в кототором записаны ЧИСЛА. Так вот мне нужно прочитать эти числа и записать их значения в массив целых чисел. У меня, в лучшем случае, получается прочесть лишь коды символов. Подскажите что-нибудь действующее плиз
  Вверх
Kefir
Дата 20.1.2003, 02:31 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ну, если числа через пробелы, то:

fstream file;
int numb[100];
file.open("file.txt", ios::in);
for(int a=0; a< /*кол-во чисел*/ ; a++)
{
  file>>numb[a];
}

если же у тебя определённый метод записи, то просто считываешь весь файл в, допустим, CString, а потом выбираешь оттуда числа.
  Вверх
PunkRat
Дата 20.1.2003, 02:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Guest @ 19.1.2003, 18:31)
ну, если числа через пробелы, то:

fstream file;
int numb[100];
file.open("file.txt", ios::in);
for(int a=0; a< /*кол-во чисел*/ ; a++)
{
  file>>numb[a];
}

если же у тебя определённый метод записи, то просто считываешь весь файл в, допустим, CString, а потом выбираешь оттуда числа.

Спасибо Кефир! :) Почти то что нужно. Только числа идут без всяких пробелов. Что то типа матрицы. Без пробелов как читать?
  Вверх
Nastya
Дата 20.1.2003, 03:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



Так числа или цифры.
Если числа, то какие между ними будут разгранечители, как понять, где закончилась одно число, и началось другое


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Kefir
Дата 20.1.2003, 03:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











да уж, ты определись пожалуйста числа у тебя или цифры, если просто цифры, то считываешь весь файл в массив переменных, и тогда в каждом эл-те массива будет каждая цифра (ну, ещё с переходом на новую строку повозиться, но это уже мелочи)
  Вверх
Nastya
Дата 20.1.2003, 04:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



Так числа или цифры.
Если числа, то какие между ними будут разгранечители, как понять, где закончилась одно число, и началось другое?


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
HexoGenus
Дата 20.1.2003, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Экс. модератор
Сообщений: 110
Регистрация: 28.8.2002
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Угу правильно, но можно еще использовать числа с фиксированным количеством знаков с впередистоящими нулями...
(Хотя может он действительно путает числа и цифры)
если матрица то все строки скорее всего одинаковой длины и количество столбцов тоже одинаковое и это упрощает дело...
Как Kefir предложил используем класс основанный на String
Код

String strTemp;
InputQuery("Чтение матрицы", "Введите количество колонок в матрице:", strTemp);
TStringList * tsLoFile=new TStringList();
tsLoFile->LoadFromFile("c:\\1.txt");
int iRow=tsLoFile->Count; //Количество строк в матрице
int iCol=strTemp.ToIntDef(1); //Количество колонок в матрице
int iLen=tsLoFile->Strings[0].Length()/iCol; //Количество цифр в числе
ShowMessage(iLen);
int **x;
x = new int*[iRow];
for (int i = 0; i < iRow; i++) x[i] = new int[iCol];
for (int i = 0; i < iRow; i++) for (int j = 0; j < iCol; j++)
                                {
                                 strTemp=tsLoFile->Strings[i].SubString((j*iLen)+1, iLen);
                                 x[i][j] = strTemp.ToIntDef(1);
                                }
for (int i = 0; i < iRow; i++) for (int j = 0; j < iCol; j++)
                                {
                                 ShowMessage(String("Элемент х(")+(i+1)+","+(j+1)+")="+x[i][j]);
                                }

--------------------
Когда невозможно уже работать напряженнее, начни работать умнее.
PM MAIL WWW ICQ   Вверх
HexoGenus
Дата 20.1.2003, 05:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Экс. модератор
Сообщений: 110
Регистрация: 28.8.2002
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Кстати просьба к тем кто работал с многомерными массивами проверьте плиз правильно ли я объявляю границы массива и подставляю индексы... а то справка билдера по new меня несколько смутила... то они под строки индекс j использовали то под столбцы...
руки бы им оторвать по самые уши... :D
--------------------
Когда невозможно уже работать напряженнее, начни работать умнее.
PM MAIL WWW ICQ   Вверх
билдерец
Дата 20.1.2003, 09:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











справка билдера-отдельная статья. Тем кто ее писал надо присвоить дворянство, чтобы они назывались деБилдеры!
  Вверх
Medved
Дата 20.1.2003, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: нет
Всего: 154



Цитата(Guest @ 20.1.2003, 04:17)
справка билдера-отдельная статья. Тем кто ее писал надо присвоить дворянство, чтобы они назывались деБилдеры!

напиши что-нибудь лучше, тогда и говори так....


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Kefir
Дата 21.1.2003, 06:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











HexoGenus, если тебе нужна справка про new, то посмотри в MSDN, я более чем уверен что там про это есть. А если уж там плохо написано, то вряд ли кто лучше объяснит...
  Вверх
PunkRat
Дата 22.1.2003, 00:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо вам за ваши ответы! :) У меня действительно ЦИФРЫ, ничем не разделённые, просто каждый новый символ - отдельный элемент массива должен быть. Ну я решил что просто нужно читать из файла при помощи fgetc и конвертить это всё atoi пропуская все '\n'... вроде работает
  Вверх
simanyay
Дата 22.1.2003, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


Профиль
Группа: Участник
Сообщений: 2053
Регистрация: 22.8.2002

Репутация: нет
Всего: 36



А как же '\0'? Хоть он и в конце, но всё же существует


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
HexoGenus
Дата 22.1.2003, 04:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Экс. модератор
Сообщений: 110
Регистрация: 28.8.2002
Где: Ростов-на-Дону

Репутация: нет
Всего: нет



Цитата(Guest @ 20.1.2003, 22:55)
HexoGenus, если тебе нужна справка про new, то посмотри в MSDN, я более чем уверен что там про это есть. А если уж там плохо написано, то вряд ли кто лучше объяснит...

Хммм... да не справка по new мне нужна а простая практика с многомерными массивами ...
Не приходилось как то до этого динамически их создавать...
Для школьных задачек обычно их размер можно определить заранее, а в программах которые пишу как-то необходимости не было.. вот и попросил проверить Вас надеясь что вы с этим работали и с одного взгляда обнаружите возможную ошибку...
Код

int m = 3;
int n = 5;
// создаем двумерный массив в котором будет 3 строки и 5 колонок
int **data;

// Это наши 3 строки
data = new int*[m];

int *temp;
for (int i = 0; i < m; i++)
 {
  // а это мы в i-ую строку добавляем 5 колонок
  data[i]=temp= new int[n];
  // темп мы используем что бы занести значения
  // еще не разобравшись где строки а где столбцы
  // именно в выделенное им место...
  // а правильно использовать data[i][j]
  for (int j = 0; j < n; j++) temp[j]=i*j;
 }

  // ну и для проверки выводим массив чисел на экран...
  for (int i = 0; i < m; i++)
   {
    Memo1->Lines->Add("==> ");
    for (int j = 0; j < n; j++) Memo1->Lines->Strings[i]=Memo1->Lines->Strings[i]+data[i][j]+" , ";
   }
  // теперь я знаю что у массива data[i][j] i - это строка а j - это колонка
  // и командой data = new int*[m]; я добавляю в него строки
  // а командой data[i]= new int[n]; я добавляю в него столбцы...

Ну вот и я теперь не только могу динамически создавать многомерные массивы но и понимаю как это работает...  :)
Кстати проверил в предыдущем коде там все индексы раставлены правильно...
Жаль не пригодится...  :(
--------------------
Когда невозможно уже работать напряженнее, начни работать умнее.
PM MAIL WWW ICQ   Вверх
Vaulter
Дата 23.1.2003, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: 2
Всего: 22



о господи!!!HexoGenus, да перейди ты наконец на std::vector
это куда удобнее, чем массив указателей.


--------------------
PM MAIL WWW ICQ   Вверх
Nastya
Дата 23.1.2003, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



Кстате, работе с динамическими массивами не плохая статейка посвещена в FAQ этого раздела форума


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Gannibal
Дата 17.4.2003, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 742
Регистрация: 15.4.2003
Где: 010101

Репутация: нет
Всего: 17



да уж проблему у вас числа с фаила прочитать :/ ну иа ничего против неимеиу, ну вот если иа как пониал чсила друг wозле друга без пробелов так счто ето проблем или надо задать так штобы у тебиа ети числа были 4 местныэ например
Код
0001000200030004
и тд и тп... тогда бы можно было без проблем напрограмировать... так што ура к своэму лиубимому комилиатору и пробовать пробовать пока невыиыдет


--------------------
Я родился в этом безумном мире - и Я сделаю всё чтобы в нём выжить!
PM MAIL ICQ   Вверх
DENNN
Дата 17.4.2003, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Цитата
о господи!!!HexoGenus, да перейди ты наконец на std::vector
это куда удобнее, чем массив указателей.

Во-во. Лучще бы в FAQ пример с вектором загнали, а то людей с толку сбивают боьшие строчки кода.

Цитата
У меня действительно ЦИФРЫ, ничем не разделённые, просто каждый новый символ - отдельный элемент массива должен быть.

Если каждый следующий БАЙТ в файле отдельное ЧИСЛО то так:
Код

#define ARRAY_COUNT 1000
BYTE array[ARRAY_COUNT];
FILE* file;
file=fopen(.....
.....
fread(array,sizeof(array),ARRAY_COUNT,file);

Если каждый БАЙТ ASCII символ цифры то самый простой (и самый ме-е-е-едленный) способ - это считать в буфер, к примеру CString
Код

CString fbuf;
for (int i=0;i<fbuf.GetLength();i++) array[i]=atoi(fbuf.GetAt(i));


Для многомерных массивов алгоритм обобщиш сам (я надеюсь smile.gif ).
А вообще, конечно, надо это сделать на динамических массивах.Тогда этой прогой уже можно будет реально пользоваться.
А в будущем формулируй вопросы точнее.
PM ICQ   Вверх
aMiGo!
  Дата 18.4.2003, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 6.4.2003
Где: Тула

Репутация: нет
Всего: нет



Я как-то тоже этим занимался, долго парился, но вот что получилось....

Код


#define MAX 255
ifstream fin;
ofstream fout;
char ch;
char str[0x50], *p;  //80
int array[MAX];
int eCount = 0;



 do {
       p = str;
       ch = fin.peek(); // Выяснение типа следующего символа
       if(isdigit(ch)) {
           while(isdigit(*p=fin.get())) p++; // Считывание целаго
            fin.putback(*p); // Возврат символа в поток
           *p = '<!--POST BOX-->'; // Заканчиваем строку нулем
           //printf("Digit %d\n",atoi(str));
           array[bCount] = atoi(str);   //Помещаем в массив найденое число
            bCount++; // Увеличиваем наш счетчик

       }
       else if(isalpha(ch)) { // Считывание строке
           while(isalpha(*p=fin.get())) p++;
           fin.putback(*p); // Возврат символа в поток
           *p = '<!--POST BOX-->'; // Заканчиваем строку нулем
           printf("Not digit '%s', skiping..\n",str);
           eCount++;

       }
       else fin.get(); // пропуск

   } while(!fin.eof());
    fin.close();
   if (bCount > 0 )
   {
       if (eCount == 0)
       cout << "No errors found\n";
    cout << "--------------------------";
    cout << "\nOK!..";
    printf("Found %d digits",bCount);
    }
    else
    {                 // файл не содержит чисел
       cout << "\nERROR: file does not contain digits";
       printf("\n\nPress any key to continue\n");
   
       while(!getch());
       exit(-11);
    }


--------------------
With the best regards, Anton
PM MAIL   Вверх
kruchinin
Дата 19.4.2003, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 19.4.2003

Репутация: нет
Всего: нет



Во-первых, мой совет!
Все операции с файлами делай с помощью стандартных функций Win32 API.
На опыте убедился, что именно у них отсутствуют ошибки и много возможностей, хотя иной раз их долго писать.

А так:
Если у тебя известны коды символов, то какие проблемы получить числа
Код символа '0' - 48
То есть, получив код цифры ты просто вычитаешь из неё 48 и получаешь нужную цифру

Посети мой сайт vidikon.by.ru
PM MAIL   Вверх
DENNN
Дата 19.4.2003, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Если еще вспомнить что в числе может быть -,+,.,e,E то не все так просто окажется.
PM ICQ   Вверх
Drag
Дата 1.5.2003, 18:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А если нужно содрать всю строку в файле(с пробелами)?
Вот сдесь переменной sdata присваевается только то, что до первого пробела...

ifstream file("gr.lst");
char cdata[2048];
CString sdata;

file>>cdata;
sdata = (LPSTR)cdata;
file.close();

Как сделать что бы в sdata была вся строка с пробелами?
  Вверх
kruchinin
Дата 1.5.2003, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 19.4.2003

Репутация: нет
Всего: нет



методами fstream я не пользуюсь, но когда раньше пользовался то помню, что с такой проблемой сталкивался. Да, я её как-то решил (не помню как - было 3 года назад). С тех пор перешел на методы stdio.h
А уже после этого на стандартные методы WIN32 API - самые надежные методы для работы с вводом-выводом файлов (и тебе советую)!
PM MAIL   Вверх
Drag
Дата 1.5.2003, 18:47 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Пробовал я и так:

FILE *file;
char* file_name = "gr.lst";
char load_string[2048];
CString string="Word"

file = fopen( file_name, "r");
if( file != 0 )
{
while(1)
{
fgets( load_string, 2048 , file );
sdata = (LPSTR)load_string;
if(sdata==string)
{
AfxMessageBox(sdata);
break;
}
}
}
else cout << "File not found !!!" << endl;
fclose(file);

При присутствии в файле строки "Word", не срабатывал почему то if(sdata==string). Даже когда обе переменные делал char, но в sdata запихивалась правда вся строка, даже с пробелами...
Вот так вот... там одно, а там другое.
  Вверх
DENNN
Дата 1.5.2003, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



А ты точку останова поставь на строке if(sdata==string) и посмотри, что же сравнивается.
Не срабатываеттолько если операция == возвращает ЛОЖЬ. smile.gif

Это сообщение отредактировал(а) DENNN - 1.5.2003, 19:12
PM ICQ   Вверх
Drag
Дата 1.5.2003, 19:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











AfxMessageBox(sdata); выдаёт мне sdata каждой строки
Я думал мож портится string, поэтому и его тоже выводил
Когда доходит до нужной строки, выпадают две таблички "Word"... одинаковые... почему if не проходит, не знаю............
  Вверх
Drag
Дата 4.5.2003, 15:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Блин, от вас пока дождёшься, уже сам нашёл. smile.gif))
  Вверх
DENNN
Дата 4.5.2003, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Вот это правильно smile.gif)
PM ICQ   Вверх
Molnienosetz
Дата 4.5.2003, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 6.3.2003
Где: Россия, Королёв, комитетский лес

Репутация: нет
Всего: нет



Цитата
Ну я решил что просто нужно читать из файла при помощи fgetc и конвертить это всё atoi


Не въехал, если каждый следующий байт, кроме \n\r - число (цифра), зачем нужна atoi?
--------------------
"Вы только появились на форуме, но уже стали весьма популярны. Правда не как профессионал, а большой зазнайка."Это про меня! :) (В том смысле, что писалось не про меня.)
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1191 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.