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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2011, 10:04   #1
Sneeze
Новичок
Джуниор
 
Регистрация: 29.12.2011
Сообщений: 4
По умолчанию Чтение данных из файла txt, язык C

В общем, пишу я простенькую программу.
Пользователь заходит в неё, вводит дату, вводил количество нескольких параметров работы. Это действие происходит день, через день.
Программа должна уметь запоминать эти данные и в любой момент вывести сумму работы за определенный период, заданный пользователем.
Написал я код, который только записывает данные, а как их считывать ума не приложу. Подскажите, как это сделать?
(формат записи в txt файле не важен)

Вот собственно код.

Цитата:
#include<stdio.h>

int main()
{
int a, b, c;
FILE *out;
printf("What date is it today? ");
scanf("%d", &a);
out = fopen("1.txt", "a");
printf("How much apples? ");
scanf("%d", &b);
printf("How much oranges? ");
scanf("%d", &c);
fprintf(out, "Дата: %d\n", a);
fprintf(out, "Яблок - %d\n", b);
fprintf(out, "Апельсинов - %d\n\n", c);
fclose(out);
}

Последний раз редактировалось Sneeze; 29.12.2011 в 10:08.
Sneeze вне форума Ответить с цитированием
Старый 29.12.2011, 12:03   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Я бы посоветовал не записывать слова "дата, яблок, апельсинов", а просто делать записи по 3 целых числа. Считывать потом проще - записями по 3 целых числа)
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 29.12.2011, 17:54   #3
Sneeze
Новичок
Джуниор
 
Регистрация: 29.12.2011
Сообщений: 4
По умолчанию

Есть и такой вариант. У меня вопрос, как организовать цикл таким образом, чтобы можно было считывать значения с нескольких фалов, названия которых будут 1, 2, 3, 4 и т.д.?
Sneeze вне форума Ответить с цитированием
Старый 29.12.2011, 18:02   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Sneeze Посмотреть сообщение
Есть и такой вариант. У меня вопрос, как организовать цикл таким образом, чтобы можно было считывать значения с нескольких фалов, названия которых будут 1, 2, 3, 4 и т.д.?
1. Открыли все нужные файлы
2. Начать главный цикл
2.1 начать перебор имен файлов, пока не перебрали все имена
- считали из файла, чье имя соответствует индексу цикла 2.1
- см пункт 2.1
3. Закончили главный цикл
4. Закрыли файлы.
5. Профит!
_Bers вне форума Ответить с цитированием
Старый 29.12.2011, 20:28   #5
Sneeze
Новичок
Джуниор
 
Регистрация: 29.12.2011
Сообщений: 4
По умолчанию

то есть что-то типо
Цитата:
int a,b,z,x,c,q=0,w=0,e=0;
scanf("%d %d", &a, &b);
for(;a<=b;a++);
{
file = fopen(вот тут проблема. как ему сказать, что имя файла = a.txt???, "a");
fscanf("%d %d %d", &z, &x, &c);
fclose(a.txt);
q=z+q;
w=x+w;
e=c+e;
}
Единственная проблема - file = fopen(вот тут проблема. как ему сказать, что имя файла = a.txt???, "a");
Вроде бы =) Хотя не уверен на 100%
Sneeze вне форума Ответить с цитированием
Старый 29.12.2011, 21:06   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
file = fopen(вот тут проблема. как ему сказать, что имя файла = a.txt???, "a");
Код:
file = fopen("a.txt", "a");
_Bers вне форума Ответить с цитированием
Старый 30.12.2011, 05:12   #7
Sneeze
Новичок
Джуниор
 
Регистрация: 29.12.2011
Сообщений: 4
По умолчанию

Возможно, вы меня не поняли. Имя должно быть не a.txt, а значение переменной a.txt
Вот это возможно реализовать?

То есть у меня идея такая. Каждую новую дату создается новый текстовый файл с названием, как дата. А далее он тупо перебирает файлы в нужном мне промежутке.
Sneeze вне форума Ответить с цитированием
Старый 30.12.2011, 11:12   #8
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

А если:

Код:
BOOL ScanItFolder;
CString path="папка, в которой лежат файлы";
ScanItFolder = m_finder.FindFile(path+"\\*.*");
while(ScanItFolder)
{
   ScanItFolder = m_finder.FindNextFile();
   if (!m_finder.IsDirectory() && !m_finder.IsDots()) //не папка и не точка
   {
      //здесь проверяем условие, в твоём случае, 
      //как я понял, время создания
      //и если сработало, то 
      CString fname = m_finder.GetFileName();
      file = fopen(path+"\\"+fname, "a");
   }
}
m_finder.Close();
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 30.12.2011, 14:34   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Sneeze Посмотреть сообщение
Возможно, вы меня не поняли. Имя должно быть не a.txt, а значение переменной a.txt
Вот это возможно реализовать?

То есть у меня идея такая. Каждую новую дату создается новый текстовый файл с названием, как дата. А далее он тупо перебирает файлы в нужном мне промежутке.
Код:
std::string fileName; // <--- вот здесь имя файла. Изначально там пусто.
int a=1;                  //<--- вот здесь индекс, добавляемый к имени файла

IntToStr(a, fileName);     //теперь имя файла "1"
                                  //Примечение: функцию, конвертирующую int в  
                                  //string нужно родить самостоятельно

fileName=fileName+".txt"; //теперь имя файла "1.txt"
Смысл в том, что ты как программист знаешь точно, какие имена у целевых файлов. Что бы автоматизировать их обработку, ты кодируешь имена особыми символами, такими как: "1.txt", "2.txt"

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

Операции анализа символьной строки и её модификации, как правило "дорогие". Пожирают кучу процессорного времени. Если нужна производительность, можно заранее закэшировать имена обрабатываемых файлов:

1 Этап. Подготовка данных:
- Создаём массив стрингов, в которых будем хранить имена обрабатываемых файлов:
std::vector< std::string> myFileNameArray; //массив имен обрабатываемых файлов

- Раcсчитаем имена обрабатываемых файлов: InitFileNameArray( size_t MaxNumber, myFileNameArray);
где:
MaxNumber - максимальное количество обрабатываемых файлов
myFileNameArray - массив, который будет содержать список готовых имен обрабатываемых файлов

Пример использования: InitFileNameArray(2, myFileNameArray);
В результате работы функции, список имен будет следующим: "0.txt", "1.txt"

2 Этап. Штатная работа: Количество обрабатываемых файлов известно: myFileNameArray.size() вернёт количество имен
Сами имена тоже известны: myFileNameArray[index] вернёт имя файла ассоциированное с данным индекстом.
То есть, myFileNameArray[0] вернёт "0.txt", myFileNameArray[1] вернёт "1.txt" и тд

А дальше, делай с этими именами все что захочешь.

3 Этап. Выгрузка из памяти: вектор, и стринги при самоуничтожении сами освободят всю захваченную динамически память. Таким образом, на 3м этапе нужно будет только позакрывать все те файлы, что ты пооткрывал на 2м этапе.

Смысл прост: твоя программа нуждается в качественных инструментах, ускоряющих и облегчающих разработку. Если ты не ведаешь таких инструментов у себя под рукой - сделай их сам.

Последний раз редактировалось _Bers; 30.12.2011 в 14:47.
_Bers вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
чтение и отображение из ".txt" файла в dataGridView Leva_89 C# (си шарп) 0 23.03.2011 23:23
if и чтение+вывод из файла .txt webber9989 PHP 4 24.08.2010 22:13
PL/SQL, построчное чтение txt файла seriousMalish SQL, базы данных 0 09.06.2010 21:31
Чтение из файла(язык С) Naper214 Помощь студентам 5 12.04.2010 00:11
Чтение из TXT файла soonner Общие вопросы Delphi 1 14.03.2009 13:52