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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение из файла 
:(
    Опции темы
Recev
Дата 4.3.2011, 18:40 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть *.txt файл. В нем хранятся два числа в таком виде:
Цитата

число1/число2
Например:
2/3

Нужно считать эти два числа в две переменные типа int.
Подскажите как это сделать, никогда толком не работал с файлами(.
PM MAIL   Вверх
KaraKum
Дата 4.3.2011, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В этом случае лучше всего прочитать полностью строку, а потом разбить её на две части используя "/" как делитель.
Код

#include <fstream>

std::fstream file("file_name");
std::string line;
std::getline(file, line);
//парсить...


Добавлено @ 18:45
Для парсинга можно использовать boost::tokenizer, но это, конечно, избыточно для такой маленькой задачки если он в проекте ещё не используется.

Если формат строк гарантированно будет таким, то ещё проще:
Код

#include <fstream>

std::fstream file("file_name");
int value1;
file >> value1;
file.peek();
int value2;
file >> value2;


Это сообщение отредактировал(а) KaraKum - 4.3.2011, 18:49
PM MAIL WWW   Вверх
Recev
Дата 4.3.2011, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

#include <fstream>
fstream file("10.txt");
int value1;
file >> value1;
file.peek();
int value2;
file >> value2;
cout<<value1<<endl<<value2;
getch();

Не работает толком. Выводит непонятно что.
PM MAIL   Вверх
KaraKum
Дата 4.3.2011, 19:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хм, да - "/" не является разделительным символом для парсера - вот с пробелом работает.
Придётся тогда читать строку и разбивать:
Код

#include <fstream>
#include <cstdio>
#include <string>

int main()
{
    std::fstream file("file_in.txt");

    std::string line;
    std::getline(file, line);

    std::string firstString = line;
    firstString.erase(firstString.find('/'));
    std::string secondString = line;
    secondString.erase(0, secondString.find('/') + 1);

    int value1 = atoi(firstString.c_str());
    int value2 = atoi(secondString.c_str());
}

PM MAIL WWW   Вверх
Recev
Дата 4.3.2011, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

#include <fstream>
#include <cstdio>
#include <string>
int main()
{
    std::fstream file("file_in.txt");
    std::string line;
    std::getline(file, line);
    std::string firstString = line;
    firstString.erase(firstString.find('/'));
    std::string secondString = line;
    secondString.erase(0, secondString.find('/') + 1);
    int value1 = atoi(firstString.c_str());
    int value2 = atoi(secondString.c_str());
}

Не работает.

А если числа будут в формате:
Цитата

число1
число2

Хоть как нибудь помогите сделать.
PM MAIL   Вверх
KaraKum
Дата 4.3.2011, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код работает - я проверял.
Слэш точно прямой? Может обратный - "\" ?
Если
Цитата

value1
value2

то это также как и
Цитата

value1 value2

в обоих случаях читать нужно будет так:
Код

std::fstream file("file_in.txt");
int value1;
file >> value1;
int value2;
file >> value2;


Добавлено через 52 секунды
При этом во втором случае между числами может быть произвольное количество пробелов.
PM MAIL WWW   Вверх
Recev
Дата 4.3.2011, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А у меня выводит не содержимое файла, а какие-то числа.
Вот даже один символ с файла не может прочитать (может дело в компиляторе? Пользуюсь Embarcadero C++ Builder XE):
Код

int main()
{ int mas[3];
ifstream ifs("F:\10.txt");
ifs >> mas[1];
printf("mas[1] = %d", mas[1]);
getch();
}

PM MAIL   Вверх
GorbunovDiman
Дата 4.3.2011, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как вариант могу предложить следующее:
Код

#include<cstdio>

int main(){

freopen("input.in"/*Или какой нить другой */,"rt",stdin);
int a,b;
char c;
scanf("%d",&a) ; // число a
scanf("%c",&c); // твой разделитель. в данном слочае прокатит любой символ :)
scanf("%d",&b); // b

printf("наше а = %d  наше b = %d",a,b);



}



В олимпиадных задачах прокатывало!
PM MAIL   Вверх
Recev
Дата 4.3.2011, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

#include<cstdio>
int main(){
freopen("input.in"/*Или какой нить другой */,"rt",stdin);
int a,b;
char c;
scanf("%d",&a) ; // число a
scanf("%c",&c); // твой разделитель. в данном слочае прокатит любой символ :)
scanf("%d",&b); // b
printf("наше а = %d  наше b = %d",a,b);
}

Результат: а=1  b=256 
Файл:
15/22
О_о

Это сообщение отредактировал(а) Recev - 4.3.2011, 20:59
PM MAIL   Вверх
rudvil
Дата 4.3.2011, 22:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

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



Цитата(file.txt)
0/1
2/3
100/200
4/5

Код
#include <iostream>
#include <fstream>

int main(int argc, char* argv[]) {
  std::ifstream input("file.txt");
  while(input.good()) {
    int left;
    int right;
    input >> left;
    input.get(); // skip /
    input >> right;
    std::cout << left << ", " << right << std::endl;
  }
  input.close();
  return 0;
}

Цитата(output)
0, 1
2, 3
100, 200
4, 5


Это сообщение отредактировал(а) rudvil - 4.3.2011, 22:44
--------------------
xor
PM MAIL Skype   Вверх
KaraKum
Дата 4.3.2011, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А кодировка, случайно, не unicode?  smile 
PM MAIL WWW   Вверх
GorbunovDiman
Дата 5.3.2011, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Результат: а=1  b=256 
Файл:
15/22
О_о


Для Unicode строку 
Код

scanf("%c",&c); // твой разделитель. в данном слочае прокатит любой символ :)


надо дублировать или изменить на 
Код

scanf("%с%c",%c,&c); // твой разделитель. в данном слочае прокатит любой символ :)

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.0907 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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