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

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

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

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

28.11.2008, 01:12. Просмотров 1383. Ответов 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;
    }
    
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2008, 01:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение из файла: в чем подвох? (C++):

в чем подвох?! - C++
всем здраствуйте, вот в книжке дана, вот эта кодировка и задание, чтобы найти ошибку и исправить, я запускал и ошибку указал на m= a; но я...

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

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

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

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

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2008, 01:12
Привет! Вот еще темы с ответами:

Чтение файла с несколькими знаками конца файла - C++
В файле несколько раз встречается ноль, и ни как не получается прочитать его полностью. Как можно решить данную проблему ?

Где подвох? - C++
Вот код пишет что z необьявлен! #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int zvezda(int z) { cout&lt;&lt;&quot;Enter...

Чтение входных данных размером больше чем 4096 символов - C++
Даны такие условия задачи, что входные данные введенные с клавиатуры (из файла) могут достигать 10 000 символов их надо соответственно...

Циклический сдвиг, где подвох? - C++
/* Проект 7-1 Функции циклического сдвига байта влево и вправо. */ #include&lt;iostream&gt; using namespace std; char...


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

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

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