Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
murzik07
49 / 44 / 19
Регистрация: 05.04.2015
Сообщений: 217
#1

Чтение текстового файла специфического файла - C++

06.03.2018, 14:58. Просмотров 160. Ответов 4
Метки нет (Все метки)

Добрый день!
Есть один текстовый файл определенного формата.
Заголовок по столбцам такой: год месяц день а1 флаг1 а2 а3 а4 а5 флаг2 а6 а7 и еще 12 столбцов (которые не нужны).
Проблемы при чтении:
1. Когда дни и месяцы двузначные, они сливаются и программа их читает как единое целое.
2. Иногда после второго флага в столбце есть знак минус, опять программа читает флаг2 и а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
24
25
26
27
28
29
30
31
32
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
 
int main()
{
    const char *Namefile;
    Namefile = "data.txt";
    int header = 0, LineNumber = 0, NumberHeaders = 0;
    std::string strHeader;
    std::vector<std::vector<double>> array;
    std::ifstream file(Namefile, std::ios_base::in);
    std::string str1, str2, str3, str4, str5, str6, str7, str8, str9, str10, str11, str12, str13, str14, str15;
    double a1, a2, a3, a4, a5, a6, a7, a8, a9;
    if (!file.is_open()) {
        std::cout << "File can't open!" << std::endl;
    }
    else {
        while (file.good()) {
            
            array.push_back(std::vector<double>());
            file >> a1 >> a2 >> a3 >> a4 >> str1 >> a5 >> a6 >> a7 >> a8 >> str2 >> a9 >> str3 >> str4 >> str5 >> str6 >> str7 >> str8 >> str9 >> str10 >> str11 >> str12 >> str13 >> str14;
            array[LineNumber].push_back(a6);
            LineNumber++;
        }
    }
    file.close();
    std::cout << "End!" << std::endl;
    return 0;
}
Подскажите как правильно прочесть файл...
0
Вложения
Тип файла: txt data.txt (1.3 Кб, 8 просмотров)
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2018, 14:58
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Чтение текстового файла специфического файла (C++):

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла.
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;locale.h&gt; #include&lt;iomanip&gt;...

как может корректно выполняющийся оператор >> (чтение из текстового файла) негативно влиять на открытие другого файла?
Друзья! Создадим два текстовых файла, f_0.txt и f_1.txt и что-нибудь в них...

Чтение из текстового файла
Всем доброго времени суток. Допустим у меня есть файл (file.txt) Содержание...

Чтение текстового файла
Помогите с программой, пожалуйста. В ворде код программы, а в текстовом файле...

Чтение текстового файла
Знакомлюсь с чтением текстового файла. Изначально была такая программа: ...

Чтение из текстового файла
Суть вопроса, дана строка такого формата: ...

4
nd2
2828 / 2398 / 1054
Регистрация: 29.01.2016
Сообщений: 8,022
06.03.2018, 16:17 #2
Цитата Сообщение от murzik07 Посмотреть сообщение
Подскажите как правильно прочесть файл...
Записывать нормально нужно...
0
igorrr37
1863 / 1481 / 749
Регистрация: 21.12.2010
Сообщений: 2,473
Записей в блоге: 11
06.03.2018, 17:52 #3
1. Читать file.getline(a1, 3) - будет прочитано два символа
2. Читать в char - будет считан один символ
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 <fstream>
#include <iostream>
#include <vector>
#include <string>
 
int main()
{
    const char *Namefile;
    Namefile = "data.txt";
    int header = 0, LineNumber = 0, NumberHeaders = 0;
    std::string strHeader;
    std::vector<std::vector<double>> array;
    std::ifstream file(Namefile, std::ios_base::in);
    std::string str3, str4, str5, str6, str7, str8, str9, str10, str11, str12, str13, str14, str15;
    char str1, str2;
    double a4, a5, a6, a7, a8, a9;
    char a1[3], a2[3], a3[3];
    if (!file.is_open()) 
    {
        std::cout << "File can't open!" << std::endl;
    }
    else 
    {
        while (file.good()) 
        {
            array.push_back(std::vector<double>());
            file.getline(a1, 3).clear();
            file.getline(a2, 3).clear();
            file.getline(a3, 3).clear();
            file >> a4 >> str1 >> a5 >> a6 >> a7 >> a8 >> str2 >> a9 >> str3 >> str4 >> str5 >> str6 >> str7 >> str8 >> str9 >> str10 >> str11 >> str12 >> str13 >> str14;
            file.ignore(file.rdbuf()->in_avail() + 1, '\n');
            array[LineNumber].push_back(a6);
            LineNumber++;
        }
    }
    file.close();
    std::cout << "End!" << std::endl;
    return 0;
}
1
murzik07
49 / 44 / 19
Регистрация: 05.04.2015
Сообщений: 217
07.03.2018, 16:04  [ТС] #4
Сначала все работало, но что то идет не так иногда. А именно, формат файла немножко изменился. Надо в файле найти
столбец MJD совпадающий с входным параметром currentMJD. До currentMJD = 58164 - программа все правильно выводит. Но с currentMJD = 58165 при чтении что то идет не так...
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
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
 
int main()
{
    const char *Namefile;
    Namefile = "data.txt";
    double currentMJD = floor(58164.589);
    std::cout << "Current MJD date equal " << currentMJD << std::endl;
    int header = 20, LineNumber = 0, NumberHeaders = 0;
    std::string strHeader;
    std::vector<double> array;
    std::ifstream file(Namefile, std::ios_base::in);
//  std::string str3, str4, str5, str6, str7, str8, str9, str10, str11, str12, str13, str14, str15;
    char str1, str2;
    double MJD, xPole, a6, yPole, a8, UT1_UTC;
    char a1[3], a2[3], a3[3];
    if (!file.is_open())
    {
        std::cout << "File can't open!" << std::endl;
    }
    else
    {
        //array.push_back(double());
        while (file.good())
        {
            if (header == 0) {
            }
            while (NumberHeaders < header) {
                getline(file, strHeader, '\n');
                NumberHeaders++;
            }           
            file.getline(a1, 3).clear();
            file.getline(a2, 3).clear();
            file.getline(a3, 3).clear();
            file >> MJD >> str1 >> xPole >> a6 >> yPole >> a8 >> str2 >> UT1_UTC;// >> str3 >> str4 >> str5 >> str6 >> str7 >> str8 >> str9 >> str10 >> str11 >> str12 >> str13 >> str14;
            file.ignore(file.rdbuf()->in_avail(), '\n');
            if (MJD == currentMJD) {
                array.push_back(xPole);
                array.push_back(yPole);
                array.push_back(UT1_UTC);
                break;
            }       
        }
    }
    file.close();
    if (array.empty()) {
        std::cout << "No data! Need update file " << Namefile << std::endl;
        std::cout << "(" << std::endl;
    }
    else {
        std::cout << "Xp       Yp        ut1-utc" << std::endl;
        std::cout << array[0] << " " << array[1] << " " << array[2] << std::endl;
        std::cout << "Happy end!" << std::endl;
    }   
    return 0;
}
0
Вложения
Тип файла: txt data.txt (19.0 Кб, 5 просмотров)
igorrr37
1863 / 1481 / 749
Регистрация: 21.12.2010
Сообщений: 2,473
Записей в блоге: 11
08.03.2018, 17:49 #5
Лучший ответ Сообщение было отмечено murzik07 как решение

Решение

проблема в строке 40. in_avail() возвращает не количество оставшихся символов в файле (как я предполагал), а какое то меньшее число. Замени вот на это: file.ignore(INT_MAX, '\n');

Добавлено через 7 часов 51 минуту
если ширина каждого столбца фиксированная то можо всё через getline читать
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <iomanip>
 
int main()
{
    const char *Namefile = "data.txt";
    double currentMJD = floor(58178.589);
    std::cout << "Current MJD date equal " << currentMJD << std::endl;
    int header = 0, LineNumber = 0, NumberHeaders = 0;
    std::string strHeader;
    std::vector<double> array;
    std::ifstream file(Namefile);
    //  std::string str3, str4, str5, str6, str7, str8, str9, str10, str11, str12, str13, str14, str15;
    char str1, str2;
    double MJD, xPole, a6, yPole, a8, UT1_UTC;
    char arr[24][20];
    if (!file.is_open())
    {
        std::cout << "File can't open!" << std::endl;
    }
    else
    {
        //array.push_back(double());
        while (file.good())
        {
            if (header == 0) {
            }
            while (NumberHeaders < header) {
                getline(file, strHeader, '\n');
                NumberHeaders++;
            }
            file.getline(arr[0], 3).clear();
            file.getline(arr[1], 3).clear();
            file.getline(arr[2], 3).clear();
            file.getline(arr[3], 10).clear();//double MJD
            file.getline(arr[4], 4).clear();
            file.getline(arr[5], 10).clear();//double xPole
            file.getline(arr[6], 11).clear();//double a6
            file.getline(arr[7], 10).clear();//double yPole
            file.getline(arr[8], 11).clear();//double a8
            file.getline(arr[9], 3).clear();
            file.getline(arr[10], 11).clear();//double UT1_UTC
            file.getline(arr[11], 12).clear();
            file.getline(arr[12], 8).clear();
            file.getline(arr[13], 9).clear();
            file.getline(arr[14], 7).clear();
            file.getline(arr[15], 10).clear();
            file.getline(arr[16], 11).clear();
            file.getline(arr[17], 10).clear();
            file.getline(arr[18], 8).clear();
            file.getline(arr[19], 11).clear();
            file.getline(arr[20], 11).clear();
            file.getline(arr[21], 15).clear();
            file.getline(arr[22], 11).clear();
            file.getline(arr[23], 7).clear();
                        
            //file >> MJD >> str1 >> xPole >> a6 >> yPole >> a8 >> str2 >> UT1_UTC;// >> str3 >> str4 >> str5 >> str6 >> str7 >> str8 >> str9 >> str10 >> str11 >> str12 >> str13 >> str14;
            file.ignore(INT_MAX, '\n');
            MJD = strtod(arr[3], nullptr);
            if (MJD == currentMJD) {
                array.push_back(xPole = strtod(arr[5], nullptr));
                array.push_back(yPole = strtod(arr[7], nullptr));
                array.push_back(UT1_UTC = strtod(arr[10], nullptr));
                break;
            }
        }
    }
    file.close();
    if (array.empty()) {
        std::cout << "No data! Need update file " << Namefile << std::endl;
        std::cout << "(" << std::endl;
    }
    else {
        std::cout << "Xp       Yp        ut1-utc" << std::endl;
        std::cout << array[0] << " " << array[1] << " " << std::setprecision(7) << array[2] << std::endl;
        std::cout << "Happy end!" << std::endl;
    }
    return 0;
}
1
08.03.2018, 17:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2018, 17:49
Привет! Вот еще темы с решениями:

Чтение из текстового файла
Добрый день. Проблема моя в следующем: есть текстовой файл примерно следующего...

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

Чтение из текстового файла
Условие задачи: В текстовый фаил (c:\program\zitel.txt) записаны: -...

Чтение из текстового файла
Вот код: #include &lt;iostream&gt; using std::cout; using std::endl; using...


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

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

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