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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 40, средняя оценка - 5.00
co6ak
Кошковед
 Аватар для co6ak
403 / 496 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
08.09.2011, 11:52     Как правильно открыть файл и считать из него строку? #1
Прювет!
подскажите пажалста, как правильно открыть и считать строку из файла.
весь функционал по обработке уже написал, а тут застрял как внебрачный ребенок буратино >_<

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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2011, 11:52     Как правильно открыть файл и считать из него строку?
Посмотрите здесь:

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

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

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

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

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

Добавлено через 1 минуту
В связке с QTextStream - то, что доктор прописал
co6ak
Кошковед
 Аватар для co6ak
403 / 496 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
08.09.2011, 12:25  [ТС]     Как правильно открыть файл и считать из него строку? #8
не вариант. этот кусок будет правиться (скорее всего) не только под Qt
accept
4838 / 3237 / 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();
Lupus
 Аватар для Lupus
22 / 22 / 1
Регистрация: 13.03.2011
Сообщений: 319
09.09.2011, 11:12     Как правильно открыть файл и считать из него строку? #10
Здравствуйте.
Как можно считать следующий символ после .peek() из потока?
Есть текстовый файл разбитый на строки. Считываю по словно, но нужно определить где кончается строка. Если строка кончается буквами, то .peek() возвращает "возврат каретки", но стоит поставить пробел - весь алгоритм ломается, а следующее слово идет уже со следующей строки.
talis
 Аватар для talis
789 / 541 / 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 );
Lupus
 Аватар для Lupus
22 / 22 / 1
Регистрация: 13.03.2011
Сообщений: 319
09.09.2011, 11:55     Как правильно открыть файл и считать из него строку? #12
Я хочу считывать по словам, не пропуская мимо перевод каретки )) Так можно?)
Как можно считать whitespace, кроме peek() ?
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
09.09.2011, 11:56     Как правильно открыть файл и считать из него строку? #13
Lupus, не понял. Помимо считывания по словам, вы ещё хотите знать, когда будет возврат каретки? На строке может быть больше одного слова?
Lupus
 Аватар для Lupus
22 / 22 / 1
Регистрация: 13.03.2011
Сообщений: 319
09.09.2011, 12:00     Как правильно открыть файл и считать из него строку? #14
Цитата Сообщение от talis Посмотреть сообщение
Lupus, не понял. Помимо считывания по словам, вы ещё хотите знать, когда будет возврат каретки? На строке может быть больше одного слова?
Да. Да. Peek`ом проверял, но если whitespace`ы идут подряд, то уже не работает.
talis
 Аватар для talis
789 / 541 / 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;
}
-=ЮрА=-
Заблокирован
Автор FAQ
09.09.2011, 12:46     Как правильно открыть файл и считать из него строку? #16
talis, как я понял прикол был именно string использовать
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
09.09.2011, 12:48     Как правильно открыть файл и считать из него строку? #17
-=ЮрА=-, ну вы же видите, подошло человеку. К тому же под string переписать - это не такая большая проблема
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 12:54     Как правильно открыть файл и считать из него строку? #18
Цитата Сообщение от talis Посмотреть сообщение
К тому же под string переписать - это не такая большая проблема
Нельзя стринг использовать. Там оператор + уже перегружен. И наследовать от него низя.
-=ЮрА=-
Заблокирован
Автор FAQ
09.09.2011, 12:59     Как правильно открыть файл и считать из него строку? #19
Цитата Сообщение от Deviaphan Посмотреть сообщение
Нельзя стринг использовать. Там оператор + уже перегружен. И наследовать от него низя.
- это да, но считать в буфер а затем отдать строке можно

co6ak, вот твой код всего с 1-м дополнением
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
#include <iostream>
#include <fstream.h>
#include <cstring>
#include <conio.h>
 
using std::string;
 
int main()
{
    string lines;
    string buff;
 
    char s[256];
 
    ifstream file("test.txt");
    if(file.is_open())
    {
        while(!file.eof())
        {
            file>>s;
            buff = s;
            lines += buff;
            lines += "\r\n";
        } 
    }
    else
        std::cerr << "Error open file!\n";
    std::cout<<"ReadStrings\r\n";
    std::cout <<lines.c_str() << "\r\n";
    std::cout<<"Press any key to continue";
    getch();
    return 0;
}
Миниатюры
Как правильно открыть файл и считать из него строку?  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2011, 13:01     Как правильно открыть файл и считать из него строку?
Еще ссылки по теме:

Работа с файлами(открыть файл, считать данные в double массив) C++
C++ Открыть файл и записать в него строку
Записать в двоичный файл строку, потом считать ее и вывести на экран C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
09.09.2011, 13:01     Как правильно открыть файл и считать из него строку? #20
Цитата Сообщение от talis Посмотреть сообщение
-=ЮрА=-, ну вы же видите, подошло человеку. К тому же под string переписать - это не такая большая проблема
- но не автору ТС
Yandex
Объявления
09.09.2011, 13:01     Как правильно открыть файл и считать из него строку?
Ответ Создать тему
Опции темы

Текущее время: 16:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru