Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 40, средняя оценка - 5.00
co6ak
Кошковед
409 / 502 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
#1

Как правильно открыть файл и считать из него строку? - C++

08.09.2011, 11:52. Просмотров 5619. Ответов 40
Метки нет (Все метки)

Прювет!
подскажите пажалста, как правильно открыть и считать строку из файла.
весь функционал по обработке уже написал, а тут застрял как внебрачный ребенок буратино >_<

C++
1
2
3
4
5
6
7
8
9
10
11
12
    std::ifstream file("C:\\interface.txt");
    std::string lines;
 
    if(file.is_open()){
            std::string buff;
            while( !file.eof()){
                    std::getline(file, buff);
                    lines += buff + '\n';
            } file.close();
            std::cout << lines << std::endl;
    } else
            std::cerr << "Error open file!\n";
ошибка: variable 'std::ifstream file' has initializer but incomplete type
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2011, 11:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно открыть файл и считать из него строку? (C++):

Открыть файл и записать в него строку - C++
Здравствуйте! Подскажите пожалуйста почему вылетает такая ошибка, когда запускаю в visual studio? #include &quot;stdafx.h&quot; #include...

Как открыть файл в требуемой для него программе? - C++
как указать программе на файл и просмотреть информацию и запустить при желании? расширение может быть любое...

Как при помощи ф-ий read/write записать в файл, а потом считать с него - C++
Такой вопрос! Как при помощи ф-ий read/write записать в файл, а потом считать с него различные типы данных, как int,double, char, char. ...

Как правильно считать и записать в файл - C++
Вот такие вот классы, как правильно записать, а затем считать из файла class Base { public: Base(string s=&quot;&quot;):name(s){} virtual...

Как правильно считать побайтово файл в массив - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;cstdlib&gt; #include &lt;time.h&gt; #include &lt;string&gt; using namespace std; int...

Как правильно открывать файл и записывать/читать из него - C++
Как правильно открывать файл и записывать/читать из него? На разных сайтах и учебниках есть различные примеры етого но везде разные ...

40
-=ЮрА=-
Заблокирован
Автор FAQ
08.09.2011, 11:55 #2
Цитата Сообщение от co6ak Посмотреть сообщение
lines += buff + '\n';
попробуй так
C++
1
2
lines += buff;
lines += "\n";
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.09.2011, 11:55 #3
Хэдэр то подключил для ifstream?
1
co6ak
Кошковед
409 / 502 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
08.09.2011, 12:11  [ТС] #4
конечно подключил.

если это имеет значение, сижу в QtSDK под MinGW

Добавлено через 9 минут
можно еще поставить вопрос другим образом:
как иначе открыть файл и построчно считывать в нем информацию?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
08.09.2011, 12:11 #5
Судя по тексту сообщения, тип std::ifstream имеет предварительное объявление и всё. Т.е. хэдэр с определением типа не подключен.
1
co6ak
Кошковед
409 / 502 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
08.09.2011, 12:15  [ТС] #6
да ну иво, этот qt под виндой.

запустил виртуалку, скопировал код. запустил - работает.
отказывается видимо считывать либу <fstream> (или чо там не делает), хотя она есть в папке библиотек.

вопрос закрыт. опять инопланетяне. всем спс
 Комментарий модератора 
Полегче со словами
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
08.09.2011, 12:21 #7
co6ak, можно один совет на будущее? QFile, раз уж вы под Qt. Точно будет работать везде, где работает Qt.

Добавлено через 1 минуту
В связке с QTextStream - то, что доктор прописал
0
co6ak
Кошковед
409 / 502 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
08.09.2011, 12:25  [ТС] #8
не вариант. этот кусок будет правиться (скорее всего) не только под Qt
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
09.09.2011, 05:40 #9
Цитата Сообщение от co6ak
C++
1
while( !file.eof()){
зациклится при ошибке чтения

C++
1
2
3
    while(std::getline(file, buff))
        lines += buff + '\n';
    file.close();
0
Lupus
22 / 22 / 1
Регистрация: 13.03.2011
Сообщений: 326
09.09.2011, 11:12 #10
Здравствуйте.
Как можно считать следующий символ после .peek() из потока?
Есть текстовый файл разбитый на строки. Считываю по словно, но нужно определить где кончается строка. Если строка кончается буквами, то .peek() возвращает "возврат каретки", но стоит поставить пробел - весь алгоритм ломается, а следующее слово идет уже со следующей строки.
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
09.09.2011, 11:40 #11
Lupus, peek() считывает следующий символ, не извлекая его из потока. То есть следующим всегда будет тот же самый. Чтобы прочитать следующий символ с извлечением его из потока, нужно использовать либо std::istream::get(), либо std::istream::operator>>, то есть:

C++
1
2
3
4
5
6
char ch;
ch = cin.get();
// или
cin.get( ch );
// или
cin >> ch;
если вы хотите считать слово, пропуская whitespace'ы (пробелы, новые-линии и символы табуляции), то используйте operator>> применительно к массиву char или к std::string;

C++
1
2
3
4
5
char asciiz[256];
string str;
 
cin >> asciiz;
cin >> str;
если вы хотите считать строку целиком, вне зависимости от того, сколько на ней слов, со всеми whitespace'ами, используйте либо std::istream::getline применительно к массиву char, либо std::getline применительно к std::string:

C++
1
2
3
4
5
char asciiz[256];
string str;
 
cin.getline( asciiz, 256 );
getline( cin, str );
1
Lupus
22 / 22 / 1
Регистрация: 13.03.2011
Сообщений: 326
09.09.2011, 11:55 #12
Я хочу считывать по словам, не пропуская мимо перевод каретки )) Так можно?)
Как можно считать whitespace, кроме peek() ?
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
09.09.2011, 11:56 #13
Lupus, не понял. Помимо считывания по словам, вы ещё хотите знать, когда будет возврат каретки? На строке может быть больше одного слова?
0
Lupus
22 / 22 / 1
Регистрация: 13.03.2011
Сообщений: 326
09.09.2011, 12:00 #14
Цитата Сообщение от talis Посмотреть сообщение
Lupus, не понял. Помимо считывания по словам, вы ещё хотите знать, когда будет возврат каретки? На строке может быть больше одного слова?
Да. Да. Peek`ом проверял, но если whitespace`ы идут подряд, то уже не работает.
0
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
09.09.2011, 12:22 #15
Lupus,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <cstring>
 
using namespace std;
 
// возвращает первый символ после конца слова
// если до слова встречается \n,
// возвращает \n и выставляет первый байт
// buff в 0 (теперь strlen( buff ) == 0 )
char getword( istream &is, char * buff, size_t max )
{
    char ch;
    size_t i = 0;
 
    while( isspace( ch = is.get() ) )
       if( ch == '\n' )
       {
           buff[i] = 0;
           return ch;
       }
 
    do buff[i++] = ch;
    while( !isspace( ch = cin.get() ) && i + 1 < max );
 
    buff[i] = 0;
 
    return ch;
}
 
int main()
{
    char buff[256];
 
    do
       cout << "0x" << hex << (int)getword( cin, buff, 256 ) << " \"" << buff << "\"\n";
    while( strcmp( buff, "quit" ) );
 
    return 0;
}
Добавлено через 6 минут
извините, очепятка в коде:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// возвращает первый символ после конца слова
// если до слова встречается \n
// возвращает \n, выставляет первый байт
// buff в 0 (теперь strlen( buff ) == 0 )
char getword( istream &is, char * buff, size_t max )
{
    char ch;
    size_t i = 0;
 
    while( isspace( ch = is.get() ) )
       if( ch == '\n' )
       {
           buff[i] = 0;
           return ch;
       }
 
    do buff[i++] = ch;
    while( !isspace( ch = is.get() ) && i + 1 < max );
 
    buff[i] = 0;
 
    return ch;
}
Добавлено через 33 секунды
вот тест:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main()
{
    char buff[256];
 
    ifstream fs( "input.txt", ios::in );
 
    if( !fs.is_open() )
       return 1;
 
    do
    {
        char ret = getword( fs, buff, 256 );
 
        if( strlen(buff) == 0 && ret == '\n' )
           cout << " [EOL]\n";
        else if( fs.eof() )
           cout << " [EOF]\n";
        else
           cout << buff << ' ';
    }
    while( fs.good() && !fs.eof() );
 
    return 0;
}
1
09.09.2011, 12:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2011, 12:22
Привет! Вот еще темы с ответами:

Как правильно сохранить и потом считать структуру в бинарный файл - C++
Есть структура struct card { int size; char *lear; int *name; }; Эта структура это карты игрока. Заполняем ее данными, у...

Есть файл .txt с него нужно считать информацию - C++
Есть файл .txt с него нужно считать информацию и записать в строку у меня считывает только первую строку, и записывает по всем переменным ...

Работа с файлами(открыть файл, считать данные в double массив) - C++
Доброго времени суток всем! Столкнулся с проблемой при написании проги. Вот что требуется: 1)Открыть файл 2)Считать данные в массив...

Считать весь файл в строку - C++
Делаю так: string name_of_file=&quot;abba.txt&quot;; ifstream fin(name_of_file); if(!fin.is_open()){ ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru