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

Вывести последнюю строку из файла - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.88
Rusarch333
7 / 7 / 1
Регистрация: 12.08.2012
Сообщений: 96
12.08.2012, 18:11     Вывести последнюю строку из файла #1
Здравствуйте, пишу на этом форуме впервые.
Я недавно начал изучать С++, по-этому знаний мало, может-ли кто-нибудь объяснить, как вывести последнюю строку из файла (как можно проще) ? Очень нужно...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2012, 18:11     Вывести последнюю строку из файла
Посмотрите здесь:

C++ Почему последнюю строку из файла выводит дважды?
C++ Из текстового файла считать вторую строку и последнюю. Записать их в другой текстовой файл
C++ Вывести строку из файла которую мне надо!
Описать функцию PoslSu(t), которая выводит на печать последнюю строку непустого текстового файла C++
Считать из файла и вывести в командную строку C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Пaтрик
 Аватар для Пaтрик
394 / 387 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
12.08.2012, 18:22     Вывести последнюю строку из файла #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <fstream>
#include <string>
#include <exception>
 
std::string& last_line(const std::string& filename)
{
    std::ifstream inp(filename.c_str());
    if (!inp.is_open())
        throw std::exception();
    std::string str = "";
    std::string buf;
    while (std::getline(inp, buf, '\n'))
        str =  buf;
    return str;
}
Rusarch333
7 / 7 / 1
Регистрация: 12.08.2012
Сообщений: 96
12.08.2012, 18:39  [ТС]     Вывести последнюю строку из файла #3
Спасибо, чтобы не об'являть каждый раз std, делай так:

#include <iostream>

using namespace std;
Catstail
Модератор
 Аватар для Catstail
21500 / 10253 / 1669
Регистрация: 12.02.2012
Сообщений: 17,139
12.08.2012, 21:46     Вывести последнюю строку из файла #4
Это детский способ... Если файл имеет размеры 300 Мб. программа будет долгонько читать, пока дойдет до последней строки. Быстрее спозиционироваться в конец файла, прочитать килобайта 3 в буфер, найти последний разделитель строк. Все, что за ним - это и есть последняя строка.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2012, 22:23     Вывести последнюю строку из файла #5
Пaтрик, вы пробовали вывести на консоль результат работы этой функции?

Добавлено через 17 минут
Функция возвращает ссылку на локальный объект. В MSVC, в результате, нарушение прав доступа при чтении. В mingv, кроме последней строки, еще что-то непонятное выводится.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
12.08.2012, 22:40     Вывести последнюю строку из файла #6
Цитата Сообщение от Rusarch333 Посмотреть сообщение
#include <iostream>
using namespace std;
некоторые профессионалы говорят что так лучше не делать, потому что имена могут пересекаться
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
13.08.2012, 00:16     Вывести последнюю строку из файла #7
Цитата Сообщение от Rusarch333 Посмотреть сообщение
вывести последнюю строку из файла (как можно проще) ?
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
#include <iostream>
#include <fstream>
#include <cstdlib>
 
void lastString ( std::ifstream &in)
{
    char str[ 100 ];
    in.getline ( str, 100 );
     if ( ! in.eof() )
         lastString ( in );
         std::cout << str;
         exit( 0 );
}
 
int main()
{
 
    std::ifstream infile( "C:\\text.txt" );
    if ( infile.is_open() )
       lastString ( infile );
     else
     std::cout << "Error in opening file.";
    return ( 0 );
}
Rusarch333
7 / 7 / 1
Регистрация: 12.08.2012
Сообщений: 96
13.08.2012, 15:29  [ТС]     Вывести последнюю строку из файла #8
Использовал функцию, которую дал Патрик. Сейчас дам набросок:


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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <string>
#include <fstream>
 
using namespace std;
 
 
 
string str =  "";
 
string last_line(const string); // прототип 
 
int main()
 
 
{
 
    int counter = 0;
 
    ofstream outClientFile("Invoice.dat", ios::ate);
 
    if (!outClientFile)
    {
        cerr << "File could not be opened" << endl;
        exit(1);
    }
 
    while ( str != "-1")
    {
    cout << "Enter a number or -1 (for exit): "; // допустим, что вводимое пользователем число
                                                 // каждый раз больше 0;
    cin  >> str;
 
     if (str != "-1")
    outClientFile << str;
 
     else
         break;
    }
 
    last_line("Invoice.dat");
    
    int number = stoi(string(str));
 
    if (counter < number)
        cout << counter << " < " << number << endl;
 
    return 0;
}
 
 
string last_line(const string filename)
{
    ifstream inClientFile("Invoice.dat",ios::in);
 
    if (!inClientFile)
    {
        cerr << "File could not be opened" << endl;
        exit(1);
    }
 
    string buf;
 
    while (getline(inClientFile, buf))
        str =  buf;
}
Ошибка:

1>c:\documents and settings\sasha\мои документы\visual studio 2010\projects\temp2\temp3.cpp(66): warning C4715: last_line: значение возвращается не при всех путях выполнения
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.08.2012, 15:32     Вывести последнюю строку из файла #9
Цитата Сообщение от Rusarch333 Посмотреть сообщение
Ошибка:
1>c:\documents and settings\sasha\мои документы\visual studio 2010\projects\temp2\temp3.cpp(66): warning C4715: last_line: значение возвращается не при всех путях выполнения
это не ошибка, а предупреждение
Rusarch333
7 / 7 / 1
Регистрация: 12.08.2012
Сообщений: 96
13.08.2012, 16:00  [ТС]     Вывести последнюю строку из файла #10
Я знаю, что Warning - это предупреждение. Но из-за него после last_line("Invoice.dat"); программа перестает работать.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.08.2012, 16:45     Вывести последнюю строку из файла #11
Цитата Сообщение от Rusarch333 Посмотреть сообщение
string last_line(const string filename)
И где filename в функции? Если вы не используете возвращаемое функцией значение, то объявите её как void.

Добавлено через 44 минуты
Перед вызовом функции last_line(), сделайте:
C++
1
outClientFile.close();
Rusarch333
7 / 7 / 1
Регистрация: 12.08.2012
Сообщений: 96
13.08.2012, 16:54  [ТС]     Вывести последнюю строку из файла #12
Ура!! Я сделал, всем ОГРОМНОЕ СПАСИБО!!!
DaskOFF
 Аватар для DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 521
Записей в блоге: 1
13.08.2012, 17:01     Вывести последнюю строку из файла #13
Цитата Сообщение от Rusarch333 Посмотреть сообщение
Ура!! Я сделал, всем ОГРОМНОЕ СПАСИБО!!!
напиши результат может кому пригодится
Rusarch333
7 / 7 / 1
Регистрация: 12.08.2012
Сообщений: 96
13.08.2012, 17:08  [ТС]     Вывести последнюю строку из файла #14
Alsav, вся проблема была в void, но это я уже потом сам догадался. Я функции ещё не изучал по-этому сразу и не увидел, а функцию дал Патрик.

outClientFile.close(); - не нужно, так-как тут неявно вызывается функция деструктора объекта outClientFile, в результате чего файл "Invoice.dat" закрывается.

Добавлено через 4 минуты
Вот рабочий код =).

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <string>
#include <fstream>
 
using namespace std;
 
 
 
string str =  "";
 
void last_line(const string); // прототип 
 
int main()
 
 
{
 
    int counter = 0;
 
    ofstream outClientFile("Invoice.dat", ios::app);
 
    if (!outClientFile)
    {
        cerr << "File could not be opened" << endl;
        exit(1);
    }
 
    while ( str != "-1")
    {
    cout << "Enter a number or -1 (for exit): "; // допустим, что вводимое пользователем число
                                                 // каждый раз больше 0;
    cin  >> str;
 
     if (str != "-1")
    outClientFile << str << endl;
 
     else
         break;
    }
 
    last_line("Invoice.dat");
 
    cout << str << endl;
    
    int number = stoi(string(str));
 
    if (counter < number)
        cout << counter << " < " << number << endl;
 
    return 0;
}
 
 
void last_line(const string filename)
{
    ifstream inClientFile("Invoice.dat",ios::in);
 
    if (!inClientFile)
    {
        cerr << "File could not be opened" << endl;
        exit(1);
    }
 
    string buf;
 
    while (getline(inClientFile, buf))
        str =  buf;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.08.2012, 17:26     Вывести последнюю строку из файла #15
Цитата Сообщение от Rusarch333 Посмотреть сообщение
outClientFile.close(); - не нужно, так-как тут неявно вызывается функция деструктора объекта outClientFile
В каком месте вызывается?
Пaтрик
 Аватар для Пaтрик
394 / 387 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
13.08.2012, 17:31     Вывести последнюю строку из файла #16
Цитата Сообщение от alsav22 Посмотреть сообщение
В каком месте вызывается?
в деструкторе.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2012, 20:19     Вывести последнюю строку из файла
Еще ссылки по теме:

Прочитать строку из файла, разделить слова и вывести количество символов C++
C++ Как вывести определёную строку из файла?
C++ Удалить последнюю строку из файла

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.08.2012, 20:19     Вывести последнюю строку из файла #17
Цитата Сообщение от Пaтрик Посмотреть сообщение
в деструкторе.
В каком месте кода?

Добавлено через 15 минут
Деструктор объекта inClientFile сработает при выходе из функции last_line(). Деструктор объекта outClientFile сработает при выходе из функции main(). Поэтому, прежде чем пдключать файл к другому потоку (inClientFile), нужно отключить его от outClientFile.

Добавлено через 18 минут
void last_line(const string filename)
И где filename в функции?

Добавлено через 1 час 12 минут
Чтобы убедиться, что так нужно делать:
C++
1
outClientFile.close();
, проведите простой эксперимент. В вашем рабочем коде, из этой строки
C++
1
outClientFile << str << endl;
, уберите endl (или напишите так:
C++
1
outClientFile << str << '\n';
) и код перестанет работать. Из файла будут выводиться старые данные. Когда начнёт работать функция last_line(), введённые данные будут находиться ещё в буфере потока. Новые введённые данные будут записаны в файл, только при выходе из main(). Тут проблема связана с очисткой буфера потока, что происходит и при endl, и при outClientFile.close();. Можно, так же, применить:
C++
1
outClientFile.flush();
Yandex
Объявления
13.08.2012, 20:19     Вывести последнюю строку из файла
Ответ Создать тему
Опции темы

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