Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 19.07.2013
Сообщений: 121
1

Чтение из файла

21.12.2013, 16:06. Показов 641. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В файле хранится 5 строк о каждом человеке разделенной точкой с запятой. То бишь фамилия;имя;отчество;дата_рождения;курс;пол
Когда в файл записываешь больше 5 строк, то выводит вот такую ошибку:

Unhandled exception at 0x001a4d62 in Train.exe: 0xC0000005: Access violation writing location 0x00e3f3e1.

Собственно это потому, что программа не может перевести буквы числа. Но проблема в том, что непонятно почему в переменной list[i].year появляется помимо возраста еще и фамилия. ЭТО ТОЛЬКО ПОТОМУ что в файле больше 5 строк. Когда в файле РОВНО 5 строк данной ошибки не возникает. В чем проблема?

list[i] - это массив структур

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
void f_open(){
    FILE *file;
 
    file = fopen("info.txt","rt");
 
    if(file == NULL){
        system("pause");
    }
 
    int i=0;
    while(!feof(file)){
 
        fscanf(file,"%s\n",buf);
        
        char *point = strchr(buf,';');
 
        strncpy(list[i].surname,buf, point-buf);
        list[i].surname[point-buf]=0;
 
 
        char *n = point + 1;
        point = strchr(point+1,';');
 
        strncpy(list[i].name, n,point - n);
        list[i].name[point - n]=0;
 
 
        char *s_n = point + 1;
        point = strchr(point+1,';');
 
        strncpy(list[i].sec_name, s_n,point-s_n);
        list[i].sec_name[point-s_n]=0;
 
 
        char *year = point + 1;
        point = strchr(point+1,';');
 
        strncpy(list[i].year, year,point-year);
        list[i].year[point-year]=0;
        
        i++;
    }
 
    fclose(file);
 
    for(int i=0;i<n;i++){
        age[i] = atoi(list[i].year);
    }
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2013, 16:06
Ответы с готовыми решениями:

Чтение чисел из файла. Чтение после конца потока невозможно
Товарищи, помогите. В Pascal'e я не силен, так что не бейте меня ногами, но есть задача: написать...

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

Чтение файла, чтение названия папки где находится файл, запись данных на PHP
Допустим у нас есть структура с папками типа Large -&gt; Vehicles -&gt; Firetruck_0 В этой папке лежит...

Чтение заголовка PCX файла и чтение растровых данных PCX файла
Привет форумчане! Столкнулся с такой проблемой. Нужно считать заголовок PCX файла и растровые...

17
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
21.12.2013, 16:38 2
Тангенс, в массиве структур 5 элементов?
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.12.2013, 16:40 3
Цитата Сообщение от Тангенс Посмотреть сообщение
list[i] - это массив структур
Какой размер массива?
1
1 / 1 / 0
Регистрация: 19.07.2013
Сообщений: 121
21.12.2013, 16:46  [ТС] 4
вообще у меня строк 7. в list[7] - стоит
в n - тоже что и в list, 7 стоит
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.12.2013, 16:54 5
Дайте больше кода. В файле, в конце последней строки, '\n' есть?

Добавлено через 1 минуту
И файл, с которым пробуете.
0
1 / 1 / 0
Регистрация: 19.07.2013
Сообщений: 121
21.12.2013, 17:05  [ТС] 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
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
#include <iostream>
#include <conio.h>
#include <cstring>
#include <ctime>
 
using namespace std;
 
char buf[42];
int n=7;
 
struct stud{
    char surname[12];
    char name[12];
    char sec_name[12];
    char year[4];
}list[7];
 
void f_open(){
    FILE *file;
 
    file = fopen("info.txt","rt");
 
    if(file == NULL){
        system("pause");
    }
 
    int i=0;
    while(!feof(file)){
 
        fscanf(file,"%s\n",buf);
        
        char *point = strchr(buf,';');
 
        strncpy(list[i].surname,buf, point-buf);
        list[i].surname[point-buf]=0;
 
 
        char *n = point + 1;
        point = strchr(point+1,';');
 
        strncpy(list[i].name, n,point - n);
        list[i].name[point - n]=0;
 
 
        char *s_n = point + 1;
        point = strchr(point+1,';');
 
        strncpy(list[i].sec_name, s_n,point-s_n);
        list[i].sec_name[point-s_n]=0;
 
 
        char *year = point + 1;
        point = strchr(point+1,';');
 
        strncpy(list[i].year, year,point-year);
        list[i].year[point-year]=0;
        
        list[i].year;
 
        i++;
    }
 
    fclose(file);
 
    for(int i=0;i<n;i++){
        age[i] = atoi(list[i].year);
    }
 
}
 
int main(){ 
    
    setlocale(LC_ALL, "Russian");
    
    f_open();
 
    _getch();
    return 0;
}
Сод. файла
Анаша;Наталья;Евгенивна;1996;1;Ж
Лизун;Паша;Вальеревич;1997;2;М
Глубокий;Артем;Игоревич;1997;3;М
Анаша;Наталья;Евгенивна;1996;1;Ж
Лизун;Паша;Вальеревич;1997;2;М
Глубокий;Артем;Игоревич;1997;3;М
Анаша;Наталья;Евгенивна;1996;1;Ж
Лизун;Паша;Вальеревич;1997;2;М
Глубокий;Артем;Игоревич;1997;3;М
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.12.2013, 17:23 7
Цитата Сообщение от Тангенс Посмотреть сообщение
Весь код:
age - это что?

Добавлено через 2 минуты
На вопрос не ответили:
Цитата Сообщение от alsav22 Посмотреть сообщение
В файле, в конце последней строки, '\n' есть?
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
21.12.2013, 17:30 8
У меня все работает )
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.12.2013, 17:31 9
Массив под 7 структур, в файле - 9. И что хотите?

Добавлено через 49 секунд
Цитата Сообщение от programina Посмотреть сообщение
У меня все работает )
Только, наверное, не тот код, который выложен... Или не с тем содержимым в файле, которое выложено...
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
21.12.2013, 17:33 10
alsav22, да, изменила вот так
C++
int age[100];
 
for(int i=0;i<n;i++){
    sscanf(list[i].year, "%d", &age[i]);
    printf("%d\n", age[i]);
}
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.12.2013, 17:36 11
А размер массива структур (или количество структур в файле)?
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
21.12.2013, 17:38 12
Цитата Сообщение от alsav22 Посмотреть сообщение
А размер массива структур (или количество структур в файле)?
В файле 9 (без изменений), размер массива 7 (тоже без изменений)
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.12.2013, 17:45 13
Цитата Сообщение от programina Посмотреть сообщение
В файле 9 (без изменений), размер массива 7 (тоже без изменений)
И вы считаете, что всё нормально? В студии из-за этого исключение вбрасывается (и правильно делается).
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
21.12.2013, 18:14 14
Цитата Сообщение от alsav22
Цитата Сообщение от programina
В файле 9 (без изменений), размер массива 7 (тоже без изменений)
И вы считаете, что всё нормально? В студии из-за этого исключение вбрасывается (и правильно делается).
.

Добавлено через 1 минуту
Дело в том, что если читать из файла только 7 строчек из 9, то ничего страшного не будет. )
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.12.2013, 18:26 15
Цитата Сообщение от programina Посмотреть сообщение
если читать из файла только 7 строчек из 9
Если... Я про это:
Цитата Сообщение от programina Посмотреть сообщение
У меня все работает )
Вы не писали, что функцию чтения из файла меняли:
Цитата Сообщение от programina Посмотреть сообщение
да, изменила вот так Код C++int age[100];
for(int i=0;i<n;i++){
* * sscanf(list[i].year, "%d", &age[i]);
* * printf("%d\n", age[i]);
}
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
21.12.2013, 18:31 16
alsav22,
Цитата Сообщение от alsav22 Посмотреть сообщение
что функцию чтения из файла меняли
не меняла. Просто сколько не запускай программу, но если там выход за пределы массива не очень большой, то ничего страшного не случится.
Кликните здесь для просмотра всего текста

C++
#include <iostream>
#include <cstdio>
#include <cstring>
#include <ctime>
 
using namespace std;
 
char buf[42];
int n=7;
 
struct stud{
    char surname[12];
    char name[12];
    char sec_name[12];
    char year[4];
}list[7];
 
 
void f_open()
{
    FILE *file = fopen("info.txt","rt");
 
    int i=0;
 
    while(!feof(file))
    {
        fscanf(file,"%s\n",buf);
 
        char *point = strchr(buf,';');
 
        strncpy(list[i].surname,buf, point-buf);
        list[i].surname[point-buf]=0;
 
 
        char *N = point + 1;
        point = strchr(point+1,';');
 
        strncpy(list[i].name, N,point - N);
        list[i].name[point - N]=0;
 
 
        char *s_n = point + 1;
        point = strchr(point+1,';');
 
        strncpy(list[i].sec_name, s_n,point-s_n);
        list[i].sec_name[point-s_n]=0;
 
 
        char *year = point + 1;
        point = strchr(point+1,';');
 
        strncpy(list[i].year, year,point-year);
        list[i].year[point-year]=0;
 
        i++;
    }
 
    fclose(file);
 
    int age[100];
 
    for(int i=0;i<n;i++){
        sscanf(list[i].year, "%d", &age[i]);
        printf("%d\n", age[i]);
    }
}
 
int main(){ 
    
    f_open();
 
    return 0;
}
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.12.2013, 19:32 17
Цитата Сообщение от programina Посмотреть сообщение
но если там выход за пределы массива не очень большой, то ничего страшного не случится.
Может не случится, может случится... Ошибка у ТС из-за чего?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.12.2013, 19:40 18
При запуске из командной строки вообще ничего не выводит. При запуске из студии, результат на скрине.
Миниатюры
Чтение из файла  
0
21.12.2013, 19:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.12.2013, 19:40
Помогаю со студенческими работами здесь

Чтение бинарного файла - чтение первых 9 байт
Есть код, который читает первые 9 байт бинарного файла(заголовок записи) void...

Чтение файла CSV и чтение из Table View
Здравствуйте, задача считать столбцы и строки excel в TextEdit. Прошу помощи в реализиции. ...

Переделать в коде чтение из файла в чтение с клавиатуры
Переделайте что бы текст считывался с клавиатуры, а не с файла! Буду благодарен за помощь! //файл...

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

Внешняя сортировка бинарного файла (чтение после конца файла невозможно)
Помогите отладить программу, не вижу, что здесь можно сделать. Похоже, курсор файла где-то в коде...

Создание файла с массивом и чтение этого файла обратно используя ShareActionProvider
Есть созданный массив, после нажатия на кнопку он должен вносится в файл, а потом передать этот...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru