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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Alpi
104 / 0 / 1
Регистрация: 16.11.2012
Сообщений: 41
#1

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

24.11.2012, 13:48. Просмотров 776. Ответов 15
Метки нет (Все метки)

Добрый день!

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

В чем ошибка?

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++
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;stdio.h&gt; #include&lt;iomanip&gt; int main(){ std::cout&lt;&lt;&quot;PE Reader\n&quot;; ...

Неправильный вывод UTF8 строки вместе с setw - C++
Есть файл с UTF8 строкой. Считываем его и выводим во второй файл с выравниванием. В результате выравнивание нету. Почему так? Чем...

Ветвления. Дает неправильный результат - C++
Не все значения сравнивает правильно, в итоге - неправильный результат Например: Ввожу a=11 b=10 ответ: -140 Почему так?...

Реализация функции копирования. Неправильный вывод полученной строки - C++
Мне нужно создать функцию, которая копирует строку S1 в строку S2, при этом удалив все символы, кроме букв. Но после проведения операции,...

Чтение из файла строки по началу строки или ее части - C++
Всем доброго времени суток! Большая просьба помочь! поступило задание, сделать словарь. Вводишь слов в консоли, а тебе выдает перевод....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MrGluck
Модератор
Эксперт CЭксперт С++
7209 / 4375 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
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
Модератор
Эксперт CЭксперт С++
7209 / 4375 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
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
5417 / 4813 / 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
5417 / 4813 / 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
5417 / 4813 / 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
5417 / 4813 / 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
5417 / 4813 / 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, 09:44
Привет! Вот еще темы с ответами:

Чтение и вывод массива из файла - C++
всем привет! пытаюсь постичь азы си++, но кое-что не получается. этот код должен был реализовать запись в файл матрицу случайных чисел и...

Чтение и вывод информации из файла - C++
Имеется текстовый файл zarplaty.txt. Необходимо вывести содержимое файла на экран в консоль.(объясните ещё как с русским языком обстоит...

Чтение из файла и вывод на экран - C++
Помогите разобраться: 1)Чтение из файла Программа должна выводить на экран данные сохраненные ею же в формате .txt, у меня не...

Чтение чисел из файла, сортировка и вывод - C++
написать 4 функции, сортирующие массив целых чисел 4 способами: - методом пузырька - методом вставки - методом выбора - быстрая...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.11.2012, 09:44
Ответ Создать тему
Опции темы

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