Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

работа с файлами

3.9K
10 марта 2007 года
АКМ
49 / / 07.06.2005
Есть текстовый файл, который содержит буквы и числовые последовательности.
Как правильно считывать из него цифры, чтобы над ними можно было проводить арифметические операции?
Пока считываю символы в массив типа unsigned char.
Пример файла:
----
PR
# deretrtegdgs
123 3454
999
111 222 333 444 555 666 777 888 999
111 222 333 444 555 666 777 888 999
111 222 333 444 555 666 777 888 999
111 222 333 444 555 666 777 888 999
....

----
надо, чтобы при считывании 111 и 222 и при операции 111+222 было в результате 333.
1
10 марта 2007 года
kot_
7.3K / / 20.01.2000
Вопрос, пожалуйста, сформулируйте нормально. Это первое. Второе - здесь готовых решений не ищут - если вас интересует кто за вас напишет необходимый код - ответ никто. До этого данная тема - кандидат на удаление.
3.9K
11 марта 2007 года
АКМ
49 / / 07.06.2005
Вопрос сформулирован нормально. Я прошу именно совета, а не готового кода. Пока пытаюсь делать так:
---
в файле записаны цифры '2' и '4' без пробела между ними
---
FILE *file;
const n = 100;
unsigned char c[n];
int a;

if((file = fopen("text.txt", "r+")) == NULL) {
cout << "Error!";
exit(1);
}
for(i = 0; i < 99; i++) {
c = '0';
}

fgets(c, 2, file); // c[0] = 2, c[1] = 4
a = c[0] + c[1];
cout << a; // печaтает '102', а надо - 6

---
пробовал преобразовывать тип данных
int b;
a = (int)c[0];
b = (int)c[1];
но все равно не то.
гуру, намекните, как надо правильно!
3
11 марта 2007 года
Green
4.8K / / 20.01.2000
Если ты пишешь на C++, используй C++.
 
Код:
ifstream in("text.txt");
int a;
in >> a;
3.9K
11 марта 2007 года
АКМ
49 / / 07.06.2005
Спасибо! Опробовал, работает.
Только вот, если файл содержит пробелы, они почему-то пропускаюся.
Можно от этого избавиться?
63
11 марта 2007 года
Zorkus
2.6K / / 04.11.2006
Так ты определись, цифры тебе надо считывать, или числа?
Если числа, то я не пойму, зачем тебе необходимо считывать пробелы. Как раз наоборот, удобнее сразу считывать готовые лексемы.
Если тебе надо считывать цифры, то открывай файл в бинарном режиме
 
Код:
ifstream in("text.txt", ios::binary);

И далее считываешь блоки символов методами
in.read(), get() и.т.д. А потом с помощью функций типа atoi() получаешь из байтовых массивов числа.
3
11 марта 2007 года
Green
4.8K / / 20.01.2000
Цитата: Zorkus

И далее считываешь блоки символов методами
in.read(), get() и.т.д. А потом с помощью функций типа atoi() получаешь из байтовых массивов числа.


Зачем так сложно?

320
11 марта 2007 года
m_Valery
1.0K / / 08.01.2007
2Green а так сложно ?
 
Код:
ifstream in("text1.txt");
   if(!in)
    cerr<<"Unable to open text.txt for reading"<<endl;                
   string text;
   vector<int> vec;
   while(getline(in,text,' ')){
         vec.push_back(atoi(text.c_str()));
       }
3.9K
11 марта 2007 года
АКМ
49 / / 07.06.2005
Видимо надо подробнее пояснить о стояещей перед мной задаче.
Вот начальный фрагмент файла (формат pgm):
--
P2
# Created by IV
16 90
255
172 172 172 172 172 172 172 172 169 169 170 172 176 178 177 175
169 165 163 165 170 175 179 171 171 172 173 174 175 176 176 173
168 164 163 166 170 171 171 170 171 171 172 172 173 173 174 170
...
--
1. надо считать первую строку,
2. пропустить вторую строку, длина которой может менятся,
3. считать два числа третьей строки,
4. считать число четвертой строки,
5. все остальные числа записать в двумерный числовой массив.

Уважаемый Green, если я делаю так:
Код:
main() {
 ofstream out("test.txt");
 out << 10 << " " << 123 << "\n";
 out.close();
 char ch;
 int i, a;

 ifstream in("test.txt");
 if( in.fail() ){
  cout << "Can't open file!";
  exit(1);
 }
 in >> i; in >> a; in >> ch;
 cout << i << " " <<  a << "\n";

 in.close();
} ,

то считывает именно числа, а если читаю из файла *.pgm (отрывок которого привел), то почему-то читает символы. 'P2' считывается только как два символа 'P' и '2', и остальное все тоже.
как надо правильно?
3
11 марта 2007 года
Green
4.8K / / 20.01.2000
Цитата: m_Valery
2Green а так сложно ?
 
Код:
ifstream in("text1.txt");
   if(!in)
    cerr<<"Unable to open text.txt for reading"<<endl;                
   string text;
   vector<int> vec;
   while(getline(in,text,' ')){
         vec.push_back(atoi(text.c_str()));
       }


Конечно. Зачем, вообще, использовать atoi, когда работаешь с потоками?

3
11 марта 2007 года
Green
4.8K / / 20.01.2000
Цитата: АКМ
Видимо надо подробнее пояснить о стояещей перед мной задаче.
Вот начальный фрагмент файла (формат pgm):
--
P2
# Created by IV
16 90
255
172 172 172 172 172 172 172 172 169 169 170 172 176 178 177 175
169 165 163 165 170 175 179 171 171 172 173 174 175 176 176 173
168 164 163 166 170 171 171 170 171 171 172 172 173 173 174 170
...
--
1. надо считать первую строку,
2. пропустить вторую строку, длина которой может менятся,
3. считать два числа третьей строки,
4. считать число четвертой строки,
5. все остальные числа записать в двумерный числовой массив.


Показываю, какие операции должны быть выполнены по каждому пункту:
1. string str; in >> str;
2. string tmp; getline(in, tmp);
3. int num1, num2; in >> num1 >> num2;
4. int num3; in >> num3;
5. for(x=0;....) for(y=0;....) in >> array[x][y];

P.S. обрамляй код в своих постах тегом

 
Код:
 
.
63
11 марта 2007 года
Zorkus
2.6K / / 04.11.2006
Цитата: Green
Зачем так сложно?


Затем, что автор спросил, как избавиться от избавление от пробелов, я и решил, что ему нужен полный контроль над файлом:)
Сказал же, сверху, в том посте, что удобней считывать >>, это ясно. А так конечно, вариантов много. Можно хоть в строку читать, а потом ее запихнуть в stringstream. Или из строки цифры выдирать.
Я пример работы с двоичным потоком привел просто.

3.9K
11 марта 2007 года
АКМ
49 / / 07.06.2005
Уважаемый Green!
Код работает, кроме одной строки. Выдает следующую ошибку:
Could not find a match for 'std::getline ifstream, std::basic_string<char, std::string_char_traits<char>, std::allocator<char>>)'.

Вроде все заголовки есть:
 
Код:
#include <conio>
#include <stdio>
#include <stdlib>
#include <iostream>
#include <fstream>
#include <string>

Почему так?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог