Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Чтение из файла


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

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

Нужно считать эти два числа в две переменные типа int.
Подскажите как это сделать, никогда толком не работал с файлами(.

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

#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;

Автор: Recev 4.3.2011, 18:55
Код

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

Не работает толком. Выводит непонятно что.

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

#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());
}

Автор: Recev 4.3.2011, 19:58
Код

#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

Хоть как нибудь помогите сделать.

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

value1
value2

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

value1 value2

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

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


Добавлено через 52 секунды
При этом во втором случае между числами может быть произвольное количество пробелов.

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

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

Автор: GorbunovDiman 4.3.2011, 20:51
Как вариант могу предложить следующее:
Код

#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);



}



В олимпиадных задачах прокатывало!

Автор: Recev 4.3.2011, 20:58
Код

#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
О_о

Автор: rudvil 4.3.2011, 22:39
Цитата(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

Автор: KaraKum 4.3.2011, 22:53
А кодировка, случайно, не unicode?  smile 

Автор: GorbunovDiman 5.3.2011, 15:20
Цитата

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


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

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


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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)