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

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

Войти
Регистрация
Восстановить пароль
 
tiptop_crazy
0 / 0 / 0
Регистрация: 27.05.2012
Сообщений: 39
#1

Проблемки с открытием файла - C++

26.03.2013, 23:56. Просмотров 372. Ответов 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
#include <iostream>
using namespace std;
struct data
{
    float mass[9];
    float res;
    void copy(float a[])
    {
        for(int i=0;i<0;i++)
            mass[i]=a[i];
    }
};
int main()
{
    FILE* in=fopen("in.txt","r");
    int count=0;
    fscanf(in,"%d",&count);
    
    char** names;
    if(count!=0)
    {
        names=new char*[count];
        for(int i=0;i<count;i++)
        {
            char temp[80];          
            fscanf(in,"%s",temp);
            names[i]=temp;      
        }           
    }
    else
    {
        cout<<"0 files\n";
        system("PAUSE");
        return 0;
    }
    fclose(in);
    data* ThreadData=new data[count];
    for(int i=0;i<count;i++)
    {
        FILE* DataForThreads=fopen(names[i],"r");// тнут не создается поток, хотя имя правильное
        float mass[9];
        for (int i = 0; i < 9; i++)
        {
            fscanf(DataForThreads, "%f", &mass[i]);      //а здесь выдает прерывание(так как поток не был создан)
        }
        ThreadData[i].copy(mass);
        fclose(DataForThreads);
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2013, 23:56     Проблемки с открытием файла
Посмотрите здесь:

C++ Перебор файла посимвольно, как организовать цикл, работающий до конца файла.
C++ В начало двоичного файла целого типа дописать нечетные элементы этого файла.
C++ Проблемки с классом
C++ Проблема с открытием файла для вывода текста в него.
C++ Сформировать два текстовых файла из целых чисел. Записать в третий файл минимальный элемент первого файла и максимальный элемент второго файла
После переустановки CodeBlocks возникли проблемы с открытием ранее написанных программ C++
Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UnsKneD
алкокодер
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
27.03.2013, 01:46     Проблемки с открытием файла #2
Во вложенном цикле используется i что и во внешнем.
Цитата Сообщение от tiptop_crazy Посмотреть сообщение
C++
1
for(int i=0;i<count;i++) { FILE* DataForThreads=fopen(names[i],"r");// тнут не создается поток, хотя имя правильное float mass[9]; for (int i = 0; i < 9; i++) { fscanf(DataForThreads, "%f", &mass[i]); //а здесь выдает прерывание(так как поток не был создан) } ThreadData[i].copy(mass); fclose(DataForThreads); }
Добавлено через 27 минут
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
#include <iostream>
using namespace std;
struct data
{
    char mass[9];
    float res;
    void copy(char a[])
    {
        for(int i=0;i<0;i++)
            mass[i]=a[i];
    }
};
int main()
{
    setlocale(0,"");
    FILE* in=fopen("in.txt","r");
    int count=0;
    fscanf(in,"%d",&count);
    
    char** names;
    if(count!=0)
    {
        names=new char*[count];
        for(int i=0;i<count;i++)
        {
            char temp[80];          
            fscanf(in,"%s",&temp);
            names[i]=temp;      
        }           
    }
    else
    {
        cout<<"0 files\n";
        system("PAUSE");
        return 0;
    }
    fclose(in);
 
    data* ThreadData=new data[count];
    for(int i=0;i<count;i++)
    {
        FILE* DataForThreads=fopen(names[i],"r");// тнут не создается поток, хотя имя правильное
        if( DataForThreads ) { cout << "Good" << endl; };
        char mass[9];
        for (int j = 0; j < 9; j++)
        {
            fscanf(DataForThreads, "%c", &mass[j]);      //а здесь выдает прерывание(так как поток не был создан)
            cout << mass[j];
        }
        cout << endl;
        ThreadData[i].copy(mass);
        fclose(DataForThreads);
    }
}
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2013, 06:12     Проблемки с открытием файла #3
В 10 строке ошибка (1 пост):
C++
1
2
for(int i=0;i<9;i++)
         mass[i]=a[i];
И выделение памяти под имена файлов нужно сделать:
C++
1
2
3
4
5
6
7
8
9
10
if(count!=0)
    {
        names=new char*[count];
        for(int i=0;i<count;i++)
        {
            names[i] = new char[80];          
            fscanf(in,"%s", names[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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
using namespace std;
 
struct data
{
    float mass[9];
    float res;
    void copy(float a[])
    {
        for(int i = 0; i < 9; i++)
            mass[i] = a[i];
    }
};
 
int main()
{
    FILE* in=fopen("in.txt","r");
    int count=0;
    fscanf(in,"%d",&count);
    
    char** names;
    if(count!=0)
    {
        names=new char*[count];
        for(int i=0;i<count;i++)
        {
            names[i] = new char[80];          
            fscanf(in,"%s", names[i]);
            
            printf("%s%c", names[i], '\n');
        } 
        
    }
    else
    {
        cout<<"0 files\n";
        system("PAUSE");
        return 0;
    }
    fclose(in);
    
    data* ThreadData=new data[count];
    for(int i = 0; i < count; i++)
    {
        FILE* DataForThreads=fopen(names[i],"r");
        float mass[9];
        for (int i = 0; i < 9; i++)
        {
            fscanf(DataForThreads, "%f", &mass[i]); 
        }
        ThreadData[i].copy(mass);
        fclose(DataForThreads);
    }
 
    for (int i = 0; i < count; ++i)
        delete [] names[i];
    delete [] names;    
    
    for (int i = 0; i < count; ++i)
    {
        for (int j = 0; j < 9; ++j)
             printf("%4.2f%c", ThreadData[i].mass[j], ' ');
        printf("\n");
    }
 
    delete [] ThreadData;
 
    system("PAUSE");
    return 0;
     
}
Миниатюры
Проблемки с открытием файла  
tiptop_crazy
0 / 0 / 0
Регистрация: 27.05.2012
Сообщений: 39
27.03.2013, 17:01  [ТС]     Проблемки с открытием файла #4
Исправил то, что было, но оно все равно потоки с заданными именами не создаются.. Да, на консоль-то имена правильные выводятся, но с их помощью не получается создать поток..
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
#include <iostream>
using namespace std;
struct data
{
    float mass[9];
    float res;
    void copy(float a[])
    {
        for(int i=0;i<0;i++)
            mass[i]=a[i];
    }
    
 
};
int main()
{
    FILE* in=fopen("in.txt","r");
    int count=0;
    fscanf(in,"%d",&count);
    
    char** names;
    if(count!=0)
    {
        names=new char*[count];
        for(int i=0;i<count;i++)
        {           
            char temp[80];
            fscanf(in,"%s",&temp);          
            names[i]=new char[strlen(temp)];
            strcpy(names[i],temp);
        }           
    }
    else
    {
        cout<<"0 files\n";
        system("PAUSE");
        return 0;
    }
    fclose(in);
    data* ThreadData=new data[count];
    for(int i=0;i<count;i++)
    {
        in=fopen((char*) names[i],"r"); //после этого действия in никуда не указывает
        float mass[9];
        for (int j = 0; j < 9; j++)
        {
            fscanf(in, "%f", &mass[j]);      
        }
        ThreadData[i].copy(mass);
        fclose(in);
    }
    for(int i=0;i<count;i++)
    {
        delete [] ThreadData;
        delete [] names[i];
    }
    delete[] names;
}
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2013, 18:24     Проблемки с открытием файла #5
Цитата Сообщение от tiptop_crazy Посмотреть сообщение
но с их помощью не получается создать поток..
Как же я тогда данные (числа, которые вывел на консоль) с файлов считал, если потоки не создаются?

Добавлено через 5 минут
Файл in.txt:
3
a.txt
b.txt
c.txt
Файл a.txt:
1
2
3
4
5
6
7
8
9
Файл b.txt:
10
11
12
13
14
15
16
17
18
Файл c.txt:
20
21
22
23
24
25
26
27
28
Результат вывода массива, со считанными из файлов данными, на скрине.

Добавлено через 3 минуты
Цитата Сообщение от tiptop_crazy Посмотреть сообщение
Исправил то, что было
10 строку так и не исправили... Для кого пишу?
Цитата Сообщение от alsav22 Посмотреть сообщение
В 10 строке ошибка (1 пост):
C++
1
2
for(int i=0;i<9;i++)
       mass[i]=a[i];
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2013, 18:35     Проблемки с открытием файла #6
Вот вам скрин, с выводом создаваемых потоков.
Миниатюры
Проблемки с открытием файла  
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2013, 20:19     Проблемки с открытием файла #7
Вот ваш исправленный код и результат работы (с выводом на консоль создаваемых потоков):
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 <iostream>
using namespace std;
 
struct data
{
    float mass[9];
    float res;
    void copy(float a[])
    {
        for(int i=0;i<9;i++)
            mass[i]=a[i];
    }
    
 
};
 
 
int main()
{
    FILE* in=fopen("in.txt","r");
    int count=0;
    fscanf(in,"%d",&count);
    
    char** names;
    if(count!=0)
    {
        names=new char*[count];
        for(int i=0;i<count;i++)
        {           
            char temp[80];
            fscanf(in,"%s",&temp);          
            names[i]=new char[strlen(temp) + 1];
            strcpy(names[i],temp);
        }           
    }
    else
    {
        cout<<"0 files\n";
        system("PAUSE");
        return 0;
    }
    fclose(in);
    
    data* ThreadData=new data[count];
    for(int i=0;i<count;i++)
    {
        in=fopen((char*) names[i],"r"); //после этого действия in никуда не указывает
        cout << "in = " << in << endl;
        float mass[9];
        for (int j = 0; j < 9; j++)
        {
            fscanf(in, "%f", &mass[j]);      
        }
        ThreadData[i].copy(mass);
        fclose(in);
    }
    
    for(int i=0;i<count;i++)
        delete [] names[i];
    delete[] names;
 
   for (int i = 0; i < count; ++i)
   {
        for (int j = 0; j < 9; ++j)
             printf("%4.2f%c", ThreadData[i].mass[j], ' ');
        printf("\n");
    }
 
    delete [] ThreadData;
 
    system("pause");
    return 0;
}
Миниатюры
Проблемки с открытием файла  
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.03.2013, 20:26     Проблемки с открытием файла #8
Память под ThreadData зачем в цикле освобождаете? Когда выделяете память с помощью strlen(), не забывайте добавлять +1 для '\0'.
tiptop_crazy
0 / 0 / 0
Регистрация: 27.05.2012
Сообщений: 39
27.03.2013, 22:15  [ТС]     Проблемки с открытием файла #9
Сначала не понял просто, что может быть там исправлено)) Спасибо огромное за помощь))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2013, 22:39     Проблемки с открытием файла
Еще ссылки по теме:

Создать программу, реализующую: создание файла, просмотр файла, поиск по файлу, выход C++
C++ Ошибка с открытием и созданием файла
Получение атрибутов файла (а именно дату создания файла) без WinApi C++
C++ Как, прочитав из файла один символ, выявить факт окончания файла
Нужно считать с файла определенное число символов и эти символы удалить из файла C++

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

Или воспользуйтесь поиском по форуму:
alsav22
27.03.2013, 22:39     Проблемки с открытием файла
  #10

Не по теме:

Кликните здесь для просмотра всего текста
Я плюсы коллекционирую.

Yandex
Объявления
27.03.2013, 22:39     Проблемки с открытием файла
Ответ Создать тему
Опции темы

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