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

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

Войти
Регистрация
Восстановить пароль
 
Dmitrii_M
2 / 2 / 0
Регистрация: 11.09.2009
Сообщений: 29
#1

Программа неадекватно реагирует на функции работы с файлом.. - C++

17.12.2009, 02:39. Просмотров 523. Ответов 9
Метки нет (Все метки)

Я написал небольшую простенькую программку, читающую что-то из файла, и записывающую что-то в другой файл, проверил на своем компе - все работает, перенес на другой отказывается, вылетает ошибка.

Компилятор: Dev-cpp.

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
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <strings.h>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    
   
    ...
    FILE* f=fopen("c:\\read3.txt","r+");
    FILE* f2=fopen("c:\\write3.txt","w+");
 
    ...     
    fseek (f, 0, 1);   fread (str,10,1,f);                    
    
    ...
 
    fclose(f);
    fclose(f2);
    system("PAUSE");
    return EXIT_SUCCESS; 
     
    
}
Причем, вылетает из-за fseek (f, 0, 1), fread (str,10,1,f), fclose(f).
Когда временно исключал(делал комментариями) из программы эти функции, то программа не завершалась ошибкой. Что еще интересно, при fopen("c:\\read3.txt","r+") программа не вылетает.
Файл c:\\read3.txt, что на одном, что на другом компе содержит одну и ту же информацию, и на обоих компах доступен для чтения/записи.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2009, 02:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа неадекватно реагирует на функции работы с файлом.. (C++):

Программа для работы с файлом - C++
Задача такая: Дан текстовый файл, в котором есть 30 наименований книг( с автором,годом издания). Нужно написать программу, что бы она ...

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

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

Программа содержащая функции для работы с массивом структур - C++
Для структуры struct marks { int fiz, mat, pr; }; struct student { char fio; struct marks m;

Программа, которая не реагирует на регистр букв - C++
Хочу написать программу на C++, которая не реагирует на регистр цифр. Например пользователь вводит страну, а программа должна показать...

Почему не работает программа-пример для демонстрации работы функции strcmp (из книги Шилдта)? - C++
Здравствуйте, помогите пожалуйста разобраться, почему программа не выполняется как надо. Программа-пример, для демонстрации работы функции...

9
easybudda
Модератор
Эксперт CЭксперт С++
9694 / 5644 / 962
Регистрация: 25.07.2009
Сообщений: 10,848
17.12.2009, 09:10 #2
Цитата Сообщение от Dmitrii_M Посмотреть сообщение
fseek (f, 0, 1);
Если нужно установить указатель позиции в начало файла, то лучше так:
C
1
rewind(f);
Ваш же вариант должен бы означать "никуда его не двигать", что странно...
Лучше всё-таки в качестве параметров SEEK_SET/SEEK_CUR/SEEK_END писать - самому понятнее, куда что двигаться должно...
1
kuroiryuu
317 / 301 / 23
Регистрация: 05.11.2009
Сообщений: 712
Завершенные тесты: 2
17.12.2009, 09:28 #3
функция fread() сама позиционируется в файле, так что fseek вообще не нужен...
а если хотели встать на начало файла, то необходимо fseek (f, 0, SEEK_SET)

PS #define SEEK_SET 0, #define SEEK_CUR 1 - в вашем примере вы использовали SEEK_CUR
1
Dmitrii_M
2 / 2 / 0
Регистрация: 11.09.2009
Сообщений: 29
17.12.2009, 11:14  [ТС] #4
Спасибо за ответы, но как тогда объяснить вылет с fclose()?
0
easybudda
Модератор
Эксперт CЭксперт С++
9694 / 5644 / 962
Регистрация: 25.07.2009
Сообщений: 10,848
17.12.2009, 14:41 #5
Dmitrii_M, а Вы бы всю программу целиком показали - может кто и понял бы...
1
kuroiryuu
317 / 301 / 23
Регистрация: 05.11.2009
Сообщений: 712
Завершенные тесты: 2
18.12.2009, 11:10 #6
действительно, а то это похоже на гадание на кофейной гуще
1
Dmitrii_M
2 / 2 / 0
Регистрация: 11.09.2009
Сообщений: 29
18.12.2009, 14:58  [ТС] #7
Вот вся программа.
Не ругайте, что коряво, просто тут нет моего любимого AnsiString вот пришлось импровизировать.

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
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <strings.h>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    cout<<"Zadacha 3: \"sqr(..5)=?\".\n";
    cout<<"Podgotovleno uchenikom 11 klassa gimnazii Maliuga Dmitriiem.\n\n\n";
    char   str[]="          ";       
    
      cout<<"   Input: c:\\read3.txt\n";
      cout<<"   Output: c:\\write3.txt\n\n";
    int num;
    FILE* f=fopen("c:\\read3.txt","r+");
    FILE* f2=fopen("c:\\write3.txt","w+");
         
    fseek (f, 0, 1);   fread (str,10,1,f);                    
    int i=atoi(str);
    
    int k,a;
    if(i>5)
    {                                                    //Если число >5
    k=(i-5)/10;
    a=(k*(k+1))*100+25;        
    }    
    else if(i==5)
    {
    a=25;                                            //Если число <5
    }
     cout<<"Ishodnoe znachenie = "<<i<<".\n";
     cout<<"Otvet = "<<a<<".\n";
     
    char ans[]="  ";
    itoa(a,ans,10);
    
    
    fwrite ( ans,strlen(ans), 1, f2);     //Вывод
        
    fclose(f);
    fclose(f2);
    system("PAUSE");
    return EXIT_SUCCESS;
    }
Как и в краткой версии в этой нет ничего такого, что могло вызвать бы ошибку.

Ошибка вылетала на ноутбуке, не вызывая дебаггер, на стационарных(проверял на нескольких) все шло без ошибок.

Мне кажется, что проблема не в программе, а в системе, что-то влияет, на программу, вызывая ошибку. Так что это общий вопрос получается.
0
easybudda
Модератор
Эксперт CЭксперт С++
9694 / 5644 / 962
Регистрация: 25.07.2009
Сообщений: 10,848
18.12.2009, 15:29 #8
Проблемы начинаются с перемешивания С и С++
Если правильно понял задачу, то вот так как-то:
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
#include <iostream>
#include <fstream>
 
int main(){
    int a, b, c;
    std::ifstream fin("read3.txt");
    if ( ! fin.is_open() ){
        std::cerr << "Can't open input file!" << std::endl;
        return 1;
    }
    
    fin >> a;
    fin.close();
    if ( a > 5 ){
        b = (a - 5) / 10;
        c = (b * (b + 1)) * 100 + 25;
    }
    else if ( a == 5 )
        c = 25;
    // а если меньше 5, то ничего не делать?
    else
        return 0;
    std::cout << "Value = " << a << std::endl << "Result = " << c << std::endl;
    
    std::ofstream fout("write3.txt");
    if ( ! fout.is_open() ){
        std::cerr << "Can't open output file!" << std::endl;
        return 1;
    }
    fout << c;
    fout.close();
    
    return 0;
}
1
kuroiryuu
317 / 301 / 23
Регистрация: 05.11.2009
Сообщений: 712
Завершенные тесты: 2
19.12.2009, 11:27 #9
в принципе эта программа и так работает.
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
#include <cstdlib>
#include <iostream>
#include <direct.h>
#include <conio.h>
#include <string>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    char str[65];       
    char cCurrentPath[255];
 
    if (!_getcwd(cCurrentPath, sizeof(cCurrentPath)))
    {
        return errno;
    }
 
    cCurrentPath[sizeof(cCurrentPath) - 1] = '\0'; /* not really required */
 
 
    string strPath ("");
    strPath.clear();
    strPath = cCurrentPath;
    strPath.insert(strPath.length(),"\\read3.txt");
 
 
    FILE *f, *f2;
    if (fopen_s(&f, strPath.c_str(), "r+") != 0)
    {
        cout << "The file 'read3.txt' was not opened" << endl;
        return 1;
    }
             
    fseek(f, 0, 1);   
    fread(str, 10, 1, f);                    
 
    fclose(f);
 
    int i = atoi(str);
 
    int k, a;
    if(i > 5)
    {                                                    //Если число >5
        k = (i - 5) / 10;
        a = (k * (k + 1)) * 100 + 25;        
    }    
    else 
        if(i == 5)
            a = 25;                                            //Если число <5
 
    cout << "Ishodnoe znachenie = " << i << ".\n";
    cout << "Otvet = " << a <<".\n";
     
    char ans[65];
    _itoa(a, ans, 10);
 
    strPath.clear();
    strPath = cCurrentPath;
    strPath.insert(strPath.length(),"\\write3.txt");
    if (fopen_s(&f2, "write3.txt", "w+") != 0)
    {
        cout << "The file 'write3.txt' was not opened" << endl;
        return 1;
    }
    else
        fwrite(ans,strlen(ans), 1, f2);     //Вывод
 
    fclose(f2);
 
    system("PAUSE");
    return 0;
}
1
Dmitrii_M
2 / 2 / 0
Регистрация: 11.09.2009
Сообщений: 29
19.12.2009, 12:52  [ТС] #10
Спасибо всем за примеры, можно считать, что вопрос решен.

// а если меньше 5, то ничего не делать?
В задаче оговаривается, что все числа - натуральные, а так как число должно оканчиваться 5, то минимальное 5. Задача про быстрое возведение чисел оканчивающихся на 5 в квадрат.
0
19.12.2009, 12:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2009, 12:52
Привет! Вот еще темы с ответами:

Программа не с первого нажатия реагирует на ввод в консоль - C++
сделал половину программы, и заметил что когда ввожу число в консольку, то не с первого нажатия реагирует. что не так сделал? #include...

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

Функция для работы с файлом - C++
У меня есть внешняя функция записанная в моей библиотеке, в эту функцию передаются 2 значения: 1 - это начало массива, в котором записано...

Класс для работы с файлом. - C++
Есть класс для сортировки файла по номеру телефона. void Job::sort() { for(;;) { ifstream fin; fin.open(filename,...


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

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

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