ifstream in("text.txt");
int a;
in >> a;
работа с файлами
Как правильно считывать из него цифры, чтобы над ними можно было проводить арифметические операции?
Пока считываю символы в массив типа 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.
Вопрос, пожалуйста, сформулируйте нормально. Это первое. Второе - здесь готовых решений не ищут - если вас интересует кто за вас напишет необходимый код - ответ никто. До этого данная тема - кандидат на удаление.
---
в файле записаны цифры '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];
но все равно не то.
гуру, намекните, как надо правильно!
Код:
Только вот, если файл содержит пробелы, они почему-то пропускаюся.
Можно от этого избавиться?
Если числа, то я не пойму, зачем тебе необходимо считывать пробелы. Как раз наоборот, удобнее сразу считывать готовые лексемы.
Если тебе надо считывать цифры, то открывай файл в бинарном режиме
Код:
ifstream in("text.txt", ios::binary);
И далее считываешь блоки символов методами
in.read(), get() и.т.д. А потом с помощью функций типа atoi() получаешь из байтовых массивов числа.
Цитата: Zorkus
И далее считываешь блоки символов методами
in.read(), get() и.т.д. А потом с помощью функций типа atoi() получаешь из байтовых массивов числа.
Зачем так сложно?
Код:
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()));
}
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()));
}
Вот начальный фрагмент файла (формат 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();
} ,
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', и остальное все тоже.
как надо правильно?
Цитата: 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()));
}
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, когда работаешь с потоками?
Цитата: АКМ
Видимо надо подробнее пояснить о стояещей перед мной задаче.
Вот начальный фрагмент файла (формат 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. все остальные числа записать в двумерный числовой массив.
Вот начальный фрагмент файла (формат 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. обрамляй код в своих постах тегом
Код:
Цитата: Green
Зачем так сложно?
Затем, что автор спросил, как избавиться от избавление от пробелов, я и решил, что ему нужен полный контроль над файлом:)
Сказал же, сверху, в том посте, что удобней считывать >>, это ясно. А так конечно, вариантов много. Можно хоть в строку читать, а потом ее запихнуть в stringstream. Или из строки цифры выдирать.
Я пример работы с двоичным потоком привел просто.
Код работает, кроме одной строки. Выдает следующую ошибку:
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>
#include <stdio>
#include <stdlib>
#include <iostream>
#include <fstream>
#include <string>
Почему так?