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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение из файла, нужна небольшая помощь 
:(
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1876 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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