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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> чтение запись в текстовый файл, Чтение и запись в текстовый файл 
:(
    Опции темы
DeadButHappy
Дата 23.9.2010, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 smile Приветствую всех. Прошу помочь в решении следующей задачки..

Дано: текстовый файл input.dat, в котором 2 строки.
      В каждой строке 3 или 4 числа (за ранее не извесно сколько),
      разделенные 1 пробелом между собой.

Задача:
1 Открыть текстовый файл input.dat для чтения,
  прочитать данные, закрыть файл, найти сумму чисел каждой строки.

2 Открыть файл повторно, но для записи. Добавить ниже 2 строки:
  "данные прочитаны успешно"
  "результат будет записан в файл output.dat"

3 Создать файл output.dat, если такой уже существует, то перезаписать.

4 Записать результат в файл output.dat
  в следующем виде:
Сумма чисел первой строки:
123
Сумма чисел второй строки:
456

Задачу необходимо решить в 2 вариантах: в чистом Си, и С++.
(тоесть возможно вариант С++ не будет работать на компиляторе для чистого Си)
Среда разработки Dev-C++.


   Вот что я пока наклепал для 1й части задачи:
Код

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
  FILE * pointer;
  pointer = fopen ("input.dat","r");
  fscanf(pointer, ??? , ???)
  
  fclose (pointer); 
  
  system("PAUSE");    
  return 0;
}



 smile  пока не пойму что указать в fscanf(pointer, ??? , ???) чтобы он считал нужные числа и причем было понятно из какой строки каждое число...


PM MAIL WWW Skype   Вверх
bsa
Дата 23.9.2010, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



ты должен читать файл построчно (для этого используй fgets() - C или std::getline() - C++), затем с помощью sscanf(buffer, "%i %i %i %i", &num1, &num2, &num3, &num4) или std::istringstream + std::istream::operator >> ты можешь распарсить прочитанную строку. sscanf возвращает количество удачно расшифрованных параметров, а объект класса std::istream (предок std::istringstream) нужно после каждой операции считывания проверять.
PM   Вверх
djamshud
Дата 23.9.2010, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



Так как заранее количество чисел в строке неизвестно, нужно устроить разбор строки.

1. Читаете строку (как сказал bsa)
2. Пишите цикл, который находит места пробелов. На этих местах делает atoi от предыдущего пробела (или начала строки) до текущего положения. Это число прибавляете к переменной сумма.
3. Ну а дальше все просто: fprintf в нужные файлы.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
bsa
Дата 23.9.2010, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



djamshud, пункт 2 ты усложнил. в задании указано, что от 3-х до 4-х чисел в строке. Поэтому сильные извраты ни к чему.
PM   Вверх
djamshud
Дата 24.9.2010, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



bsa, зато, когда препод попросит увеличить число чисел, оно взлетит без пинка:). Да и ничего сложного нет: три строки кода и хорошая практика.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
bsa
Дата 24.9.2010, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



кстати, на С++ будет значительно короче, чем на С:
Код
std::ifstream file("file.txt");
if (!file.is_open()) {
     std::cerr << "Failed to open file" << std::endl;
     return 1;
}
std::string buffer;
while (std::getline(file, buffer)) { //читаем файл построчно...
   std::istringstream stream(buffer);
   int res = std::accumulate(std::istream_iterator<int>(stream), std::istream_iterator<int>(), int(0)); //суммируем все числа в строке
   std::cout << res << std::endl; //выводим сумму на экран
}


Это сообщение отредактировал(а) bsa - 24.9.2010, 13:05
PM   Вверх
DeadButHappy
Дата 4.10.2010, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за советы.  В них в принципе было 99% решения...)
Вот что у меня получилось для варианта на Си:

Код

#include <stdio.h>                         // иногда видел что добавляют <string.h>, а зачем?
int main(int argc, char *argv[])       // а нужно ли что-то писать в скобках?
{
  FILE * pointer;
  
  pointer = fopen ("input.dat","rt");
  char str1[1000];                                 //вопрос- можно ли вместо 1000 указать точную константу n=длинне строки?
  char str2[1000];
       fgets(str1, 1000, pointer);            
       fgets(str2, 1000, pointer);         
       fclose (pointer);      
  
  float n11, n12, n13, n14=0,
        n21, n22, n23, n24=0,
        sum1, sum2;
        
        sscanf(str1,"%f %f %f %f", &n11, &n12, &n13, &n14);  // записываем последовательно отдельные числа строки в переменные  
        sscanf(str2,"%f %f %f %f", &n21, &n22, &n23, &n24);  
        sum1 = n11 + n12 + n13 + n14;      //находим сумму чисел строки
        sum2 = n21 + n22 + n23 + n24;
   
  pointer = fopen ("input.dat","at");
          fprintf ( pointer, "\ndannye prochitany uspeshno");
          fprintf ( pointer, "\nrezul'tat budet zapisan v fajl output.dat");  
  fclose (pointer);    
  
  pointer = fopen ("output.dat","w");
          fprintf ( pointer, "Summa chisel pervoj stroki:\n%f\n",sum1);
          fprintf ( pointer, "Summa chisel vtoroj stroki:\n%f",sum2);
  fclose (pointer);  
  
  return 0;
}


 Если этот код можно сделать чуть больше Си-подобным или просто более грамотно оформленным был бы благодарен за замечания..
Пока попробую осмыслить код на С++, пример которого мне дал bsa... ))
Также пока не понял как вместо 1000 указать более правильным количество копируемых символов:
Код

fgets(str1, 1000, pointer); 

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


Это сообщение отредактировал(а) DeadButHappy - 4.10.2010, 22:10
PM MAIL WWW Skype   Вверх
fuckingniger
Дата 4.10.2010, 23:53 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



совет - используй потоки -  геморроя ментше

Добавлено через 1 минуту и 6 секунд
что бы кириллицей выводить пиши в main в первой его строке

setlocale(LC_ALL,"rus");

Добавлено через 3 минуты и 36 секунд
fgets(str1, 1000, pointer); вполне приемлимо ...
можешь посимвольно считывать пока не встретишь символ '\n' там на самом деле дофига всяких функций есть и не все его видят по-моему - так что осторожно

Добавлено через 6 минут и 39 секунд
Цитата(bsa @ 24.9.2010,  13:03)
кстати, на С++ будет значительно короче, чем на С:
Код
std::ifstream file("file.txt");
if (!file.is_open()) {
     std::cerr << "Failed to open file" << std::endl;
     return 1;
}
std::string buffer;
while (std::getline(file, buffer)) { //читаем файл построчно...
   std::istringstream stream(buffer);
   int res = std::accumulate(std::istream_iterator<int>(stream), std::istream_iterator<int>(), int(0)); //суммируем все числа в строке
   std::cout << res << std::endl; //выводим сумму на экран
}

кстати, на С++ будет значительно короче, чем на С:
Код
std::ifstream file("file.txt");
if (!file.is_open()) {
     std::cerr << "Failed to open file" << std::endl;
     return 1;
}
std::string buffer;
while (std::getline(file, buffer)) { //читаем файл построчно...
   std::istringstream stream(buffer);
   int res = std::accumulate(std::istream_iterator<int>(stream), std::istream_iterator<int>(), int(0)); //суммируем все числа в строке
   std::cout << res << std::endl; //выводим сумму на экран
}


просто не могу на это смотреть . Чтобы не писать std:: напиши в препроцессоре(после инклудов) using namespace std 
и теперь std:: писать не надо
PM MAIL   Вверх
DeadButHappy
Дата 5.10.2010, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(fuckingniger @  4.10.2010,  23:53 Найти цитируемый пост)
овет - используй потоки -  геморроя ментше

так потоки вроде будут уже в С++ варианте?
PM MAIL WWW Skype   Вверх
fuckingniger
Дата 5.10.2010, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ну да.....препод наверно хотел показать этим заданием что потоки удобнее
PM MAIL   Вверх
mrbrooks
Дата 5.10.2010, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(fuckingniger @  5.10.2010,  00:53 Найти цитируемый пост)
просто не могу на это смотреть . Чтобы не писать std:: напиши в препроцессоре(после инклудов) using namespace std 
и теперь std:: писать не надо 

smile

PM MAIL   Вверх
bsa
Дата 5.10.2010, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(fuckingniger @  5.10.2010,  00:53 Найти цитируемый пост)
просто не могу на это смотреть . Чтобы не писать std:: напиши в препроцессоре(после инклудов) using namespace std 
и теперь std:: писать не надо 

 smile 
Правилом хорошего тона считается ПИСАТЬ std::. Поэтому новичку я и прививаю ПРАВИЛЬНУЮ привычку.
Далее, причем тут препроцессор? ты предлагаешь с помощью двоичного редактора изменить исполняемый файл препроцессора, чтобы не писать std? Или ты вообще не знаешь, за что отвечает препроцессор?
Цитата(fuckingniger @  5.10.2010,  01:28 Найти цитируемый пост)
ну да.....препод наверно хотел показать этим заданием что потоки удобнее 

Нет. Просто он преподает С и С++ одновременно, что делать категорически нельзя, так как это совершенно разные языки. В одной из книжек подсмотрел: сравнивать эти языки можно так же, как и английский с французским - алфавит в целом совпадает, во французском только добавлено несколько символов, но языки совершенно разные...
PM   Вверх
fuckingniger
Дата 5.10.2010, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ну скажи а ты сам то пишешь это самое std::??? - по моему это только мешает - надо думать каждый раз к какому пространству имен относится...
если быть уж педантичным сильно можно писать 
using std::cout итп

ну C и ++ не такие уж и разные )
с++ это наследник С )) в терминологии C++)))
PM MAIL   Вверх
mes
Дата 5.10.2010, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(fuckingniger @  5.10.2010,  14:25 Найти цитируемый пост)
ну скажи а ты сам то пишешь это самое std::???

я всегда smile

Цитата(fuckingniger @  5.10.2010,  14:25 Найти цитируемый пост)
с++ это наследник С ))

это ничего не меняет..  smile 


--------------------
PM MAIL WWW   Вверх
fuckingniger
Дата 5.10.2010, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(mes @  5.10.2010,  15:56 Найти цитируемый пост)
ну скажи а ты сам то пишешь это самое std::???я всегда 

ну в общем автор темы сам выберет.....зато он теперь знает 2 способа)


Цитата(mes @  5.10.2010,  15:56 Найти цитируемый пост)
Цитата(fuckingniger @  5.10.2010,  14:25 )с++ это наследник С ))это ничего не меняет..   


это ОЧЕНЬ много значит
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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