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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Mensh
0 / 0 / 0
Регистрация: 02.11.2008
Сообщений: 10
#1

Чтение из файла: в чем подвох? - C++

28.11.2008, 01:12. Просмотров 1367. Ответов 0
Метки нет (Все метки)

Народ, вот тут написал сортировку двухпутевой вставкой с разными вариантами ввода массива. Третий, как видно из кода, это ввод из файла. Програма в целом рабочая, но не могу разобраться в одной проблеме: не работает один чек, когда последний элемент стоит через энное(некоторое) кол-во enterov т.е. пустых строк. Ентера после последнего элемента нет. Причем после него может стоять ещё один элемент такого же типаю Пример:

12 23
45
65 56 98 567




123





345


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

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#include <iostream> 
#include <time.h> 
#include <stdio.h> 
using namespace std;
void tinsert (int *a, int n) // сортировка
{ 
int *x,i,j, left=n-1, right=n-1,t; 
x=(int *) malloc((2*n-1)*sizeof(int)); 
x[n-1]=a[0]; 
for(i=1; i<n; i++) 
{ 
    t=a[i]; 
    if(t>=a[0]) 
{ 
        for(j=right; j>=0&&t<x[j]; j--) 
        x[j+1]=x[j]; 
        x[j+1]=t; 
        right++; 
} 
    else 
{ 
        for(j=left; j<=2*n-1&&t>x[j]; j++) 
        x[j-1]=x[j]; 
        x[j-1]=t; 
        left--; 
} 
} 
for(j=left; j<left+n; j++) 
a[j-left]=x[j]; 
free(x); 
} 
using namespace std;
void createfilestr(char*name)//создание текстового файла
{
    printf("Creating text file...\n");
    char*str=new char [81];
    FILE *out;
    if(!(out=fopen(name,"w")))
    {
        printf("File open is failure...\n");
        return ;
    }
    printf("Input data\n");
    printf("Press Ctrl+Z for ending\n");
    
    scanf("%s",str);
    while(!feof(stdin))
    {
        fprintf(out,"%s\n",str);
        
        scanf("%s",str);
    }
    fclose(out);
}
void readfilestr(char*name)//чтение текстового файла
{
    printf("Reading text file...\n");
    char*str=new char [81];    
    FILE *in;
    if(!(in=fopen(name,"rt")))
    {
        printf("File open is failure...\n");
        return ;
    }
    fscanf(in,"%s",str);    
    while(!feof(in))
    {
        printf("%s\n",str);
        fscanf(in,"%s",str);
    }
    fclose(in);
}
void RecMas(char*name,int*b,int n)//запись данных в файл из массива
{
    int i=0;
    FILE *out;
    if(!(out=fopen(name,"w")))
    {
        printf("File open is failure...\n");
        return ;
    }
    for(i=0;i<n;i++)
    {
        fprintf(out,"%d\n",b[i]);
    }
    fclose(out);
}
bool FvMa(char*name,int*b,int *n)//запись данных из файла в массив
{
    int i=0;
    
    FILE *in;
    if(!(in=fopen(name,"rt")))
    {
        printf("File open is failure...\n");
        return false;
    }
    fscanf(in,"%d",&b[i]);    
    if (feof(in))
    {
        cout<<"File is empty!!!\n";
        return false;
    }
    else
    while (!feof(in))
    {
        i=i+1;
        fscanf(in,"%d",&b[i]);
    }
    *n=i;
    fclose(in);
    return true;
}
 
void main()
{
    const int nmax=100;
    int B[nmax],c,n,i;    
    char*name=new char[100];
    cout<<"How do you want to input data:\n 1) Keyboord enter\n 2) Random generating\n 3) Input from the text file\n";
    cin>>c;
    if(c>1)
    {
        
        cout<<"Input name of the file: \n";
        cin>>name;
    }
    switch (c)
    {
        case 1:
                cout<<"Input number of elements"<<endl;
                cin>>n;
                cout<<"Input elements of the massiv:"<<endl; 
                for(i=0;i<n;i++)
                    cin>>B[i];
                tinsert(&B[0],n);
                cout<<"Sorted massiv:"<<endl;
                for(i=0;i<n;i++)
                cout<<B[i]<<endl;
                break;
        case 2: cout<<"Input number of elements"<<endl;
                cin>>n;
                srand(time(0));
                for(i=0;i<n;i++)
                    B[i]=rand()%100;
                cout<<"Elements of sorting massiv"<<endl;
                for(i=0;i<n;i++)
                    cout<<B[i]<<endl;
                tinsert(&B[0],n);
                cout<<"Sorted massiv:"<<endl;
                for(i=0;i<n;i++)
                cout<<B[i]<<endl;
                
                RecMas(name,&B[0],n);//запись массива в файл
                readfilestr(name);//чтение файла
                break;
        case 3:            
            bool flag;
            flag = FvMa(name,&B[0],&n);//запись из файла в массив
            if (flag)
            {
                tinsert(&B[0],n);
                cout<<"Sorted massiv:"<<endl;
                for(i=0;i<n;i++)
                cout<<B[i]<<endl;
                RecMas(name,&B[0],n);//запись массива в файл
                readfilestr(name);//чтение файла
            }
            break;
    }
    
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2008, 01:12     Чтение из файла: в чем подвох?
Посмотрите здесь:

C++ в чем подвох?!
C++ Чтение из файла на C
Где подвох? C++
чтение из файла C++
C++ как может корректно выполняющийся оператор >> (чтение из текстового файла) негативно влиять на открытие другого файла?
Чтение из файла. Повторное чтение файла C++
C++ Циклический сдвиг, где подвох?
Чтение входных данных размером больше чем 4096 символов C++
Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла. C++
Чтение файла с несколькими знаками конца файла C++
C++ Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется
Переделать в коде чтение из файла в чтение с клавиатуры C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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