Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.66/47: Рейтинг темы: голосов - 47, средняя оценка - 4.66
Кошковед
521 / 509 / 63
Регистрация: 12.04.2010
Сообщений: 1,390
1

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

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.09.2011, 11:52
Ответы с готовыми решениями:

Открыть файл и считать с него данные
как открыть файл и записать с него данные? вот пример того что может быть в файле: 14 42 33 a 2...

MFC: открыть файл и считать данные из него в буфер
Здравствуйте. Начала изучать MFC, возникла проблема с файлами. У меня задание, открыть файл и...

Открыть файл и считать из него числа с N-ой строки в одномерный массив
Народ, нужна помощь! с ВБ только знакомлюсь. Необходимо в программе при нажатии на кнопку...

Открыть txt файл через OpenFileDialog и считать из него текста
Подскажите , как в виндовс формс правильно написать часть кода , для открытия txt файла через...

40
Заблокирован
Автор FAQ
08.09.2011, 11:55 2
Цитата Сообщение от co6ak Посмотреть сообщение
lines += buff + '\n';
попробуй так
C++
1
2
lines += buff;
lines += "\n";
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
08.09.2011, 11:55 3
Хэдэр то подключил для ifstream?
1
Кошковед
521 / 509 / 63
Регистрация: 12.04.2010
Сообщений: 1,390
08.09.2011, 12:11  [ТС] 4
конечно подключил.

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

Добавлено через 9 минут
можно еще поставить вопрос другим образом:
как иначе открыть файл и построчно считывать в нем информацию?
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
08.09.2011, 12:11 5
Судя по тексту сообщения, тип std::ifstream имеет предварительное объявление и всё. Т.е. хэдэр с определением типа не подключен.
1
Кошковед
521 / 509 / 63
Регистрация: 12.04.2010
Сообщений: 1,390
08.09.2011, 12:15  [ТС] 6
да ну иво, этот qt под виндой.

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

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

Добавлено через 1 минуту
В связке с QTextStream - то, что доктор прописал
0
Кошковед
521 / 509 / 63
Регистрация: 12.04.2010
Сообщений: 1,390
08.09.2011, 12:25  [ТС] 8
не вариант. этот кусок будет правиться (скорее всего) не только под Qt
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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
24 / 24 / 4
Регистрация: 13.03.2011
Сообщений: 326
09.09.2011, 11:12 10
Здравствуйте.
Как можно считать следующий символ после .peek() из потока?
Есть текстовый файл разбитый на строки. Считываю по словно, но нужно определить где кончается строка. Если строка кончается буквами, то .peek() возвращает "возврат каретки", но стоит поставить пробел - весь алгоритм ломается, а следующее слово идет уже со следующей строки.
0
794 / 546 / 61
Регистрация: 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
24 / 24 / 4
Регистрация: 13.03.2011
Сообщений: 326
09.09.2011, 11:55 12
Я хочу считывать по словам, не пропуская мимо перевод каретки )) Так можно?)
Как можно считать whitespace, кроме peek() ?
0
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
09.09.2011, 11:56 13
Lupus, не понял. Помимо считывания по словам, вы ещё хотите знать, когда будет возврат каретки? На строке может быть больше одного слова?
0
24 / 24 / 4
Регистрация: 13.03.2011
Сообщений: 326
09.09.2011, 12:00 14
Цитата Сообщение от talis Посмотреть сообщение
Lupus, не понял. Помимо считывания по словам, вы ещё хотите знать, когда будет возврат каретки? На строке может быть больше одного слова?
Да. Да. Peek`ом проверял, но если whitespace`ы идут подряд, то уже не работает.
0
794 / 546 / 61
Регистрация: 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
Заблокирован
Автор FAQ
09.09.2011, 12:46 16
talis, как я понял прикол был именно string использовать
0
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
09.09.2011, 12:48 17
-=ЮрА=-, ну вы же видите, подошло человеку. К тому же под string переписать - это не такая большая проблема
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 12:54 18
Цитата Сообщение от talis Посмотреть сообщение
К тому же под string переписать - это не такая большая проблема
Нельзя стринг использовать. Там оператор + уже перегружен. И наследовать от него низя.
0
Заблокирован
Автор 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;
}
Миниатюры
Как правильно открыть файл и считать из него строку?  
0
Заблокирован
Автор FAQ
09.09.2011, 13:01 20
Цитата Сообщение от talis Посмотреть сообщение
-=ЮрА=-, ну вы же видите, подошло человеку. К тому же под string переписать - это не такая большая проблема
- но не автору ТС
0
09.09.2011, 13:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.09.2011, 13:01
Помогаю со студенческими работами здесь

Открыть файл и записать в него строку
Здравствуйте! Подскажите пожалуйста почему вылетает такая ошибка, когда запускаю в visual studio? ...

Создать файл. Записать в него строку. Считать и вывести на экран
Файл создает и записывает в него текст, но на экран не выводит. В чем может быть ошибка? Помогите...

Открыть файл, считать строку из 10 символов и вывести ее. Почему не работает мой код?
model small .stack 254 .data fname db 'stroka1.txt',0h des dw 0 buff db 20 dup (?) .code...

Файл: Как можно открыть файл txt и занести из него данные в массив?
как можно открыть файл txt и занести из него данные в массив, а после из этого массива вывести в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru