Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 80, средняя оценка - 4.90
HappyAndRu
13 / 13 / 2
Регистрация: 19.05.2012
Сообщений: 46
#1

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

23.07.2012, 19:52. Просмотров 11911. Ответов 12
Метки нет (Все метки)

Всем привет. Не могу понять как читать из текстового файла значения разных типов. Вот мне например нужно считать файл с таким содержанием:
4
Sam Stone
2000
Freida Flass
100500
Tammy Tubbs
5000
Rich Raptor
55000

Строки должны записываться в массив char или в string, а числа в double. Первые значения нормально выдает, а дальше кракозябры. Подскажите пожалуйста как решить эту проблему. Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2012, 19:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение текстового файла (C++):

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла. - C++
#include<iostream> #include<fstream> #include<locale.h> #include<iomanip> #include <cstdlib> using namespace std; struct...

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

Чтение из текстового файла - C++
Добрый день. Проблема моя в следующем: есть текстовой файл примерно следующего содержания a 10 2 2 b 5 5 1 c 3 7 0 d 5 22 0 ...

Чтение из текстового файла - C++
как сделать чтобы прога выводила на экран слова из текстового документа пока не натыкалась на символ ";" а после этого прога начиналась с...

Чтение из текстового файла - C++
Всем доброго времени суток. Допустим у меня есть файл (file.txt) Содержание текстового файла: { 12:20 13:10 13:20 }...

Чтение текстового файла - C++
здравствуйте. у меня не получается считать текстовый файл. сам файл имеет имеет жесткую структуру: первая строка число(по сути колличество...

12
ilya-punk
4 / 4 / 0
Регистрация: 14.07.2012
Сообщений: 27
23.07.2012, 20:17 #2
Считывай всё как char *, а потом проверяй по коду каждый символ. Если у какого то символа код от 48 до 57, то этот символ - цифра. Вот тебе функция, которая конвертирует.
C++
1
2
3
4
5
6
7
8
int IntToStr(char * str)
{
       stringstream ss;
       ss<<str;
       int r;
       ss>>r;
       return r;
}
1
PreFX
25 / 20 / 1
Регистрация: 14.07.2012
Сообщений: 176
23.07.2012, 20:28 #3
Возможно, дело в том, что вы считываете всё с использованием >>, однако этот оператор считывает файлы только до пробела, т. е. для чтения строки "Sam Stone" требуется два раза применить этот оператор.
1
kravam
быдлокодер
1701 / 888 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
23.07.2012, 20:54 #4
Я бы на твоём месте считывал всё в string; а затем смотрел, какого типа переменную ты считал; вот здесь программа для распознавания типов.
Определение введенного типа
1
HappyAndRu
13 / 13 / 2
Регистрация: 19.05.2012
Сообщений: 46
24.07.2012, 00:31  [ТС] #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
40
41
#include <iostream>
#include <cstdlib>
#include <string>
#include <fstream>
 
using namespace std;
 
int main()
{
    struct mans
    {
       string name;
       double money;
    };
    
    fstream file;
    int number;
    double n;
    file.open("A.txt");
    file >> number;
  
    mans *p = new mans[number];
    getline(file,p -> name); 
    for (int i=0; i<number; i++)
    {
      getline(file,p -> name);
      file >> p -> money;
      p++;
    }
    p = p - number;
    
    for (int i = 0; i < number; i++)
    {
      cout << "Name: " << p -> name << endl;
      cout << "Money: " << p -> money << endl;
      p++;
    }
 
    system ("pause");
    return 0;
}
Вот результат:
0
Миниатюры
Чтение текстового файла  
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.07.2012, 00:38 #6
C++
1
2
3
4
5
for (int i = 0; i < number; i++)
{
      getline(file,p[i].name);
      file >> p[i].money;
}
1
HappyAndRu
13 / 13 / 2
Регистрация: 19.05.2012
Сообщений: 46
24.07.2012, 00:47  [ТС] #7
Ну теперь вообще не работает) Это же динамическая структура и такая форма обращения к членам вообще не подходит или я ошибаюсь?
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
24.07.2012, 00:59 #8
формат файла - строго определен, или нужно "умно распознавать", что в строке имеется ввиду?
0
HappyAndRu
13 / 13 / 2
Регистрация: 19.05.2012
Сообщений: 46
24.07.2012, 01:03  [ТС] #9
Строго определен, первая строка это int, дальше чередуется string и double.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.07.2012, 01:10 #10
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
#include <iostream>
#include <fstream>
#include <string>
 
#define FILENAME "input.txt"
 
struct mans
{
    std::string name;
    double money;
};
 
int main()
{
    std::ifstream file(FILENAME);
 
    if (!file.is_open())
    {
        std::cout << "cannot open file: " << FILENAME;
        return 1;
    }
 
    std::size_t size = 0;
    (file >> size).get();
    
    mans* p = new mans[size]();
 
    for (std::size_t i = 0; i < size; ++i)
    {
        std::getline(file, p[i].name);
        (file >> p[i].money).get();
    }
 
    for (std::size_t i = 0; i < size; ++i)
        std::cout << p[i].name << '\t' << p[i].money << std::endl;
 
    delete [] p;
 
    return 0;
}
1
HappyAndRu
13 / 13 / 2
Регистрация: 19.05.2012
Сообщений: 46
24.07.2012, 01:19  [ТС] #11
Ура! Все работает. Большое спасибо!
0
kravam
быдлокодер
1701 / 888 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
24.07.2012, 01:39 #12
HappyAndRu, боюсь вас разачаровать, но если кто-то залезет в "A.txt" и своими толстыми пальцами прикола ради после, например, 2000 натычет несколько пробелов, то вся затея насмарку- код не сработает. А он должен работать.

как-то так надо:
C++
1
2
3
4
5
6
7
    for (std::size_t i = 0; i < size; ++i)
    {
        std::string temp;
        std::getline(file, p[i].name);
        file >> p[i].money;
        std::getline(file, temp);
    }
1
HappyAndRu
13 / 13 / 2
Регистрация: 19.05.2012
Сообщений: 46
24.07.2012, 02:01  [ТС] #13
Да, действительно, спасибо.
0
24.07.2012, 02:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2012, 02:01
Привет! Вот еще темы с ответами:

Чтение из текстового файла - C++
Здравствуйте, Уважаемые форумчане. Возникла такая проблема. Надо считать из файла(внешнего) данные тип int и char- это 2 разных файла, в...

Чтение текстового файла - C++
Помогите с программой, пожалуйста. В ворде код программы, а в текстовом файле то, что должно быть на выходе.

Чтение из текстового файла - C++
вот этот кусок кода как будет выглядит на с++? begin assign(input,'input.txt'); reset(input); assign(output,'output.txt');...

Чтение из текстового файла - C++
Вот код: #include &lt;iostream&gt; using std::cout; using std::endl; using std::cin; void main() { setlocale(LC_ALL,...


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

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

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