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

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

Восстановить пароль Регистрация
 
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
24.11.2012, 13:48     Чтение строки из файла дает неправильный вывод #1
Добрый день!

Вопрос такой, код работает неправильно.
Смысл такой: читаем строку. Если первый симол строки такой-то, вывести единицу.

В чем ошибка?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <fstream>
 
using namespace std;
 
int main () {
 
    char name_string[14];
    FILE *file;
    file = fopen("/Users/1/Downloads/1.txt", "r");
 
    
    while ( fgets(name_string ,1024 , file) ){
        cout << name_string;
        if (name_string[0] = 'T')
        {cout << '1' << endl;}     
    }
    fclose(file);
    return 0;
}
Вывод ниже, т.е. условие отрабатывается неправильно.

After party
1
Transit time
1
Before party
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2012, 13:48     Чтение строки из файла дает неправильный вывод
Посмотрите здесь:

C++ Ветвления. Дает неправильный результат
чтение чисел из файла, сортировка и вывод C++
Чтение и вывод массива из файла C++
Чтение из файла и вывод на экран C++
C++ Неправильный вывод из бинарного файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4928 / 2671 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
24.11.2012, 14:09     Чтение строки из файла дает неправильный вывод #2
C++
1
if (name_string[0] = 'T')
Мб. стоит писать == ?
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
24.11.2012, 14:15  [ТС]     Чтение строки из файла дает неправильный вывод #3
Вот я стыдобище, конечно!

Спасибо за помощь.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4928 / 2671 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
24.11.2012, 14:20     Чтение строки из файла дает неправильный вывод #4
Цитата Сообщение от Alpi Посмотреть сообщение
Вот я стыдобище, конечно!

Спасибо за помощь.
Все через это проходили, не стоит так критично)
Я б посоветовал размер строки увеличить, а то вдруг туда реально пихнут 1024 символа, как у вас написано далее.
А еще лучше использовать fstream, все же нелепо смотрятся потоки на ввод/вывод в консоль и функции на ввод/вывод с файла.
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
24.11.2012, 17:19  [ТС]     Чтение строки из файла дает неправильный вывод #5
На самом деле, я только стартовал изучать С++ и тестирую все грабли. Вроде теорию для релализации нужного мне кода освоил по книжкам.
Стараюсь изучать на прикладных задачах, иначе просто тону в информации.
Вывод будет так же в файл, вывод в консоль осуществляется на данном этапе в целях быстрого контроля процесса.

Цель кода - заполнение структуры из файла.
Пока ни фига не заполняется, посмотрите, пожалуйста, в чем проблема дальше? Читал тут разные темы, но сам не смог разобраться.

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 <stdio.h>
#include <string.h>
#include <fstream>
 
using namespace std;
 
int main () {
    int i = 0, g = 0;
    
    struct Main_Struct{ //create a struct acc to the file description
        char name[15];
        char struct_string[1001];
        
    }man[10];
    char name_string[14];
    FILE *file;
    file = fopen("/Users/alex/Downloads/unt.txt", "r");
 
    
    while ( fgets(name_string, 1024, file) ){
        cout << name_string;
        if (name_string[0] == '>')
        {
            while (g < 15) {
                man[i].name[g] = name_string[g];
                g+=1;
            }
            i+=1;
        }
       
    }
    fclose(file);
    cout << i << endl;
    cout << man[0].name;
    cout << man[1].name;
    
    return 0;
}
Вывод получается вот такой, т.е. выводятся все строки, подсчитывается количество будущих заголовков, но массив name внутри структуры не заполняется.

>The 1
Oh, let the sun beat down upon my face, stars fill my dreams
I am a traveler of both time and space, to be where I have been
>The 2
To sit with elders of the gentle race, this world has seldom seen
They talk of days for which they sit and wait, all will be revealed
2
ays for which they sit and wait, all will be revealed


Добавлено через 7 минут
И в конце перевернутый знак вопроса, сюда он не копипастится.

Добавлено через 6 минут
Знак вопроса решил - не совпадали размеры массивов name_string[14] и name[15]

Добавлено через 2 часа 19 минут
Отладка показала, что строка попадает в man[0].name, но после окончания чтения файла бесследно оттуда исчезает и заменяется непонятным куском.

Что я делаю не так?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2012, 17:32     Чтение строки из файла дает неправильный вывод #6
После выхода из while (g < 15), g нужно обнулять.

Добавлено через 5 минут
И i нужно проверять, чтобы не выйти за размер массива man[10].
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
24.11.2012, 17:34  [ТС]     Чтение строки из файла дает неправильный вывод #7
обнуляю вот так, почему-то не выводится man[0]

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    while ( fgets(name_string, 1001, file) ){
        /* что-то сделать со строкой */
        //cout << name_string;
        if (name_string[0] == '>')
        {
            while (g < 15) {
                man[i].name[g] = name_string[g];
                g+=1;
            }
            i++;
            g = 0;
            
        }
вывод стал такой, как ниже

2 - это i
ays for which they sit and wait, all will be revealed - непонятный вывод man[0]
>The 2 - это ожидаемый вывод man[1]


i не проверяю, т.к. он 2 выдает, в файле больше и данных нет.
А так, нужно, конечно.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2012, 17:39     Чтение строки из файла дает неправильный вывод #8
name_string[14]. Как вы читаете туда 1001 символ? Или name_string увеличьте, или читайте меньше.
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
24.11.2012, 20:42  [ТС]     Чтение строки из файла дает неправильный вывод #9
Цитата Сообщение от alsav22 Посмотреть сообщение
name_string[14]. Как вы читаете туда 1001 символ?
Урррра!

Поправил и заработало ))
Радости моей нет предела.

Добавлено через 2 часа 55 минут
добавил в файл данных и немного поправил while , чтобы было универсальнее

код ниже + вывод

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
while ( fgets(name_string, 1001, file) ){
        if (name_string[0] == '>')
        {
            do  {
                man[i].name[g] = name_string[g+1];
                g+=1;
            }
            while (name_string[g+1] != '\n');
            i++;
            g = 0;
            
        }
       
    }
 
    cout << i << endl;
    while (g < i) {
        cout << man[g].name<< endl;
        g+=1;
        
    fclose(file);
    }
вывод

6
The 1
The 2
The 3
The 4 + перевернутый знак вопроса
The 5 + перевернутый знак вопроса
The 6 + перевернутый знак вопроса + \377\377\377@\250\207x\377

Пробовал менять файл, переставлять местами данные - все равно картина одинаковая.
В чем проблема, подскажите, пожалуйста?

Добавлено через 6 минут
Пробовал также цикл с проверкой условия в начале цикла, а не в конце, как здесь - картина та же.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2012, 20:45     Чтение строки из файла дает неправильный вывод #10
Полный код и файл, из которого читаете.
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
24.11.2012, 21:21  [ТС]     Чтение строки из файла дает неправильный вывод #11
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
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <fstream>
 
using namespace std;
 
int main () {
 
    int i = 0, g = 0;
    
    struct Main_Struct{ //create a struct acc to the file description
        char name[15];
        char A_string[1001];
        double average_cg;
    };
    Main_Struct man[10];
    char name_string[1001];
    FILE *file;
    file = fopen("/Users/alex/Downloads/unt.txt", "r");
 
    
    while ( fgets(name_string, 1001, file) ){
        if (name_string[0] == '>')
        {
            
            while (name_string[g+1] != '\n')
 
            {    man[i].name[g] = name_string[g+1];
                g+=1;
            }
 
            i++;
            g = 0;
        }
       else if (name_string[0] != '>')
       {
       while (name_string[g] != '>')
       {
           man[i].A_string[g] = name_string[g];
           g+=1;
       }
          g = 0; 
       }
    }
 
    cout << i << endl;
    while (g < i) {
        cout << man[g].name<< endl;
        cout << man[g].A_string << endl;
        g+=1;
        
    fclose(file);
    }
 
    return 0;
}
То есть идея такая: сначала заполняем поле name по следующему принципу: если строка начинается с '>', то она целиком идет в name. Если не начинается, то все символы текущей строки и всех последующих строк вплоть до следующего встречающегося '>' идут в соотв name поле A_string.
Со следующего '>' начинает заполняться следующая структура и т.д.

В данный момент вторая часть задачи не работает, а первая вот эти вопросы выдает.
Вложения
Тип файла: txt unt.txt (818 байт, 3 просмотров)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2012, 23:36     Чтение строки из файла дает неправильный вывод #12
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
using namespace std;
 
struct Main_Struct //create a struct acc to the file description
{ 
    char name[15];
    char A_string[1001];
    double average_cg;
};
 
 
int main () 
{
    Main_Struct man[10];
    char name_string[1001];
    
    ifstream file("unt.txt");
    if (!file.is_open()) cout << "Error!" << endl;
    else
    {
        int i = 0;
        
        while (i < 10)
        {
                file.getline(name_string, 1001);
                if (file.eof()) break;
            
                for (int j = 0; j < strlen(name_string); j++)
                    man[i].name[j] = name_string[j + 1];
            
                int g = 0;
                while (true)
                {
                    char ch;
                    file.get(ch);
                    if (file.eof() || file.peek() == '>') break;
                    man[i].A_string[g] = ch;
                    g++;
                }
                man[i].A_string[g] = '\0';
            
                i++;      
         }  
 
          cout << i << endl;
      
          for (int j = 0; j < i; j++) 
          {
              cout << man[j].name << endl;
              cout << man[j].A_string << endl;
          } 
       
          file.close();
    }
    
    system("pause");
    return 0;
}
Миниатюры
Чтение строки из файла дает неправильный вывод  
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
25.11.2012, 00:22  [ТС]     Чтение строки из файла дает неправильный вывод #13
Это нереально круто, спасибо большое.
Постараюсь по-разному модифицировать и поразбирать.

Есть вопросы.
1. Вроде бы можно в структурах символьным массивам (строкам) присваивать значения целиком, а не посимвольно. Почему здесь это не работает? Я пробовал.
2. а не сложно будет прокомментировать ключевые строчки парой слов?
строки 35 и 39 не до конца в меня проникают.

3. для исключения символа перевода строки я модифицировал код ниже, это вменяемый подход, или лучше придумать что-то другое? Я где-то встречал, что != не стоит с символами использовать, но в гугле сейчас подтверждения не нашел.
C++
1
2
3
if (ch != '\n')
                {man[i].A_string[g] = ch;
                    g++;}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.11.2012, 02:30     Чтение строки из файла дает неправильный вывод #14
Цитата Сообщение от Alpi Посмотреть сообщение
строки 35 и 39 не до конца в меня проникают
while (true) - это не понятно? Бесконечный цикл.
C++
1
if (file.eof() || file.peek() == '>') break;
Если считан конец файла или следующий символ для чтения равен '>', то выход из цикла.

Добавлено через 2 минуты
Цитата Сообщение от Alpi Посмотреть сообщение
для исключения символа перевода строки я модифицировал код ниже
Почему его нужно исключать?
Добавлено через 46 секунд
Цитата Сообщение от Alpi Посмотреть сообщение
Я где-то встречал, что != не стоит с символами использовать
Можно и с символами.

Добавлено через 1 минуту
Цитата Сообщение от Alpi Посмотреть сообщение
Вроде бы можно в структурах символьным массивам (строкам) присваивать значения целиком, а не посимвольно
Как это целиком? Объектам string можно, а массивам нет.
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
25.11.2012, 09:44  [ТС]     Чтение строки из файла дает неправильный вывод #15
Цитата Сообщение от alsav22 Посмотреть сообщение

Добавлено через 2 минуты
Почему его нужно исключать?
Так понадобилось )))

Спасибо большое за помощь!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2012, 11:44     Чтение строки из файла дает неправильный вывод
Еще ссылки по теме:

Неправильный вывод UTF8 строки вместе с setw C++
C++ Чтение файла в кодировке utf-8 и вывод в консоль
C++ Реализация функции копирования. Неправильный вывод полученной строки

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

Или воспользуйтесь поиском по форуму:
Улыкпан
Сообщений: n/a
25.11.2012, 11:44     Чтение строки из файла дает неправильный вывод #16
заданы 2 строки, состоящие из слов, разделенных пробелами. Определить первое вхождение символа "d" в строке и вывести слово, в котором оказался этот символ. Если токого символа нет, то изменить порядок следования символов на противоположный.
Yandex
Объявления
25.11.2012, 11:44     Чтение строки из файла дает неправильный вывод
Ответ Создать тему
Опции темы

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