Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
72 / 6 / 0
Регистрация: 08.08.2012
Сообщений: 223
Записей в блоге: 1
1

Чтение из файла строки неизвестной длинны

11.11.2015, 11:15. Показов 2611. Ответов 9
Метки нет (Все метки)

Здравствуйте.
Стоит задача писать в файл строку неизвестной длинны, введенную с клавиатуры. А потом считать её из файла.
Строку читаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (int i = 0; i < numStudent; i++)
    {
        printf("Write information about the student:\n");
        printf("Name: ");
 
        string str;
        cin.get();
        getline(std::cin, str);
        //arr[i].name = const_cast<char *>(str.c_str());
        str += '\0';
        char *cstr = new char[str.length() + 1];
        strcpy(cstr, str.c_str());
        arr[i].name = cstr;
}
Пишу в файл:
C++
1
fputs(arr[i].name, fin);
Читаю из файла так:
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
   void print()
    {
        FILE* fin = fopen("studentC.dat", "r");
        student first;
        if (fin == NULL)
            printf("ERROR\n");
        else
        {
            printf("Name\tKurs\tRating\n");
            while(!feof(fin))
            {
                unsigned int N = 10, delta=10, i = 0;
                char* buf = (char*) malloc (sizeof(char)*N);
                while ((buf [i] = fgetc(fin)) != '\0')
                {
                    if (++i >= N)
                    {
                        N += delta;
                        buf = (char*) realloc (buf, sizeof(char)*N);
                    }
                }
                buf[i] = '\0';
                puts (buf);
                free (buf);
                if (feof(fin))
                    break;
            }
        }
        fclose(fin);
    }
Результат: цикл чтения из файла зацикливается. Что я делаю не так? Или это можно сделать проще? Красивее?
П.с. По заданию чтение из файла нужно реализовать на C и на C++. Пока не писал реализацию на С++.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.11.2015, 11:15
Ответы с готовыми решениями:

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

Чтение строки неизвестной длины
реализация на СИ как прочитать строку неизвестной длины? Чтение должно быть не посимвольным....

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

Как динамически выделить память под массив неизвестной длинны? Длина определяется вводом с командной строки
Например, надо получить фамилию, имя и отчество пользователя через командную строку.

9
6992 / 6030 / 2738
Регистрация: 14.04.2014
Сообщений: 25,792
11.11.2015, 13:27 2
Внимательно прочитай описание fgetc().
C++
1
2
3
4
                int ch;
                while ((ch = fgetc(fin)) != EOF)
                {
                    buf[i] = ch;
1
72 / 6 / 0
Регистрация: 08.08.2012
Сообщений: 223
Записей в блоге: 1
11.11.2015, 17:11  [ТС] 3
nmcf, уже понял. А как тогда считать строку неизвестной длинны?
Сейчас я сделал так: добавляю в строку символ перевода строки, пишу в файл и читаю до тех пор пока его не встречу. Но это ведь не рационально.
0
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
11.11.2015, 17:27 4
mr_free,мой вот вариант!
C++
1
2
3
4
5
6
7
while (getline(inFile, line)) //прочитать строку inFile -  из файла, в перемеренную line
   {
 
       //что то делаем со строкой 
      
      
   }
Добавлено через 54 секунды
Смысл читать посимвольно когда нет такой задачи!?
1
6992 / 6030 / 2738
Регистрация: 14.04.2014
Сообщений: 25,792
11.11.2015, 17:52 5
Ну если древними функциями, то через fgets() блоками лучше.
1
72 / 6 / 0
Регистрация: 08.08.2012
Сообщений: 223
Записей в блоге: 1
15.11.2015, 20:18  [ТС] 6
Mesteriis, смысл в том, что С++ использовать нельзя. А на сколько я знаю getline - это плюсовая функция.
0
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
15.11.2015, 20:30 7
mr_free, По мойму ты тогда веткой форума ошибся)))

Добавлено через 44 секунды
Цитата Сообщение от mr_free Посмотреть сообщение
С++ использовать нельзя
Неожиданно прочесть это ветки про с++
1
72 / 6 / 0
Регистрация: 08.08.2012
Сообщений: 223
Записей в блоге: 1
15.11.2015, 20:55  [ТС] 8
nmcf, Mesteriis, что-то зашел в тупик.
Задание: прочитать с клавиатуры структуру, записать в файл и прочитать с файла. (А вообще целый массив структур).
Для ясности чуть повторюсь.
Есть структура:
C
1
2
3
4
5
struct student {
    char* name;
    int kurs;
    float rating;
};
Её читаем из файла:
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
int numStudent;
    cout << "Write number of students: ";
    cin >> numStudent;
    student* arr = new student[numStudent];
 
    system("cls");
    for (int i = 0; i < numStudent; i++)
    {
        printf("Write information about the student:\n");
        printf("Name: ");
 
 
        char str[SIZE];
        char *newline;
        char a = getchar();
        if(fgets(str, SIZE, stdin) == NULL)
            printf("ERROR\n");
        if((newline = strchr(str, '\n')) != NULL)
            *newline = '\0';
        arr[i].name = newline;
 
     /*
        string str;
        cin.get();
        getline(std::cin, str);
        //arr[i].name = const_cast<char *>(str.c_str());
        str += '\n';
        char *cstr = new char[str.length() + 1];
        strcpy(cstr, str.c_str());
        arr[i].name = cstr;
     */
 
        printf("Kurs: ");
        scanf("%d", &arr[i].kurs);
        printf("Rating: ");
        scanf("%f", &arr[i].rating);
        system("cls");
    }
Участок С++, как оказалось использовать нельзя, по-этому он в комментариях. Далее вызываем функции записи и чтения структуры в файл: (быдлокод)
C
1
2
 writeToFile(arr, numStudent);
 print();
Их реализация:
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
void writeToFile(student *arr, const int &n)
    {
        FILE* fin = fopen("studentC.dat", "wb");
        for (int i = 0; i < n; i++)
        {
            /*fwrite(&arr[i].name, sizeof(arr[i].name), 1, fin);
            fwrite(&arr[i].kurs, sizeof(int), 1, fin);
            fwrite(&arr[i].rating, sizeof(float), 1, fin); */
            fwrite((char *)&arr[i], sizeof(arr[i]), 1, fin);
        }
        fclose(fin);
    }
 
    void print()
    {
        FILE* fin = fopen("studentC.dat", "rb");
        student first;
        if (fin == NULL)
            printf("ERROR\n");
        else
        {
            printf("Name\tKurs\tRating\n");
            while(!feof(fin))
            {              
                unsigned int N = 10, delta=10, i = 0;
                first.name = (char*) malloc (sizeof(char)*N);
                while ((first.name [i] = fgetc(fin)) != '\0')
                {
                    if (++i >= N)
                    {
                        N += delta;
                        first.name = (char*) realloc (first.name, sizeof(char)*N);
                    }
                }
                first.name[i] = '\0';
                puts (first.name);
                fread(&first.kurs, sizeof(int), 1, fin);
                fread(&first.rating, sizeof(float), 1, fin);
                if (feof(fin))
                    break;
                printf("\t%d\t%f\n", first.kurs, first.rating);
            }
        }
        fclose(fin);
    }
Числовые данные структуры из файла читаются нормально, вот только строки - крякозябры.
Понимаю, что под сhar *name не выделена память. Как исправить код? Как правильно написать?

П.с. И еще вопрос. Почему в C++ объект этой структуры можно записать в файл полностью и так же считать (без потерь), а в С такое не проходит. Ведь в обоих случаях память под строку не выделена. Соответственно запись и чтение структуры на С++:
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
void writeToFile(student *arr, const int &n)
    {
        ofstream f("studentCPP.dat", ios::out|ios::binary);
        for (int i = 0; i < n; i++)
            f.write((char *)&arr[i], sizeof(student));
        f.close();
    }
 
    void print()
    {
        ifstream f("studentCPP.dat", ios::in|ios::binary);
        student first;
        if (!f.is_open())
           std::cout << "ERROR" << std::endl;
        else
        {
            std::cout << "Name\tKurs\tRating" << std::endl;
            while(!f.eof())
            {
                f.read((char *)&first, sizeof(first));
                if (f.eof())
                    break;
                std::cout << first.name << "\t" << first.kurs << "\t" << first.rating << std::endl;
            }
        }
        f.close();
    }
0
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
15.11.2015, 20:59 9
Цитата Сообщение от mr_free Посмотреть сообщение
С такое не проходит.
Да там много что не происходит!
Я вот честно хотел бы помочь но увы в чистых сях я нулина)))
0
72 / 6 / 0
Регистрация: 08.08.2012
Сообщений: 223
Записей в блоге: 1
15.11.2015, 21:47  [ТС] 10
Mesteriis, и то правда веткой ошибся.
Просто не пойму, какой-такой механизм работы скрыт за
C++
1
f.read((char *)&first, sizeof(first));
что нормально читает структуру, в которой char* не определенной длинны (имею в виду поле структуры)?!
Когда тот же код на С
C
1
fread((char *)&first, sizeof(first), 1, fin);
Не читает эту самую строку. Хотя остальные поля заполняет верно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2015, 21:47

Программа на подсчет длинны каждой строки из файла
Задание: Вывести на экран длину каждой строки из файла. В программе должно быть меню выбора....

Если в класс нужно передать указатель на указатель на массив строк неизвестной длинны?
Как проинициализировать массив строк wchar_t * (произвольного размера) , если его нужно передать в...

Как заменить чтение строки из консоли на чтение текстового файла?
основное задание: найти частоту суффикса (например, &quot;ing&quot;) в текстовом документе. в...

Чтение строк переменной длинны из структуры
Привет. Есть файл, данные в нем содержатся согласно такой структуре. typedef struct _string { ...


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

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

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