Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Джаспер
0 / 0 / 0
Регистрация: 22.09.2014
Сообщений: 6
1

Ошибка при попытке открытия для чтения текстового файла

23.10.2014, 17:39. Просмотров 570. Ответов 5
Метки нет (Все метки)

Первоначальная задача была такова:

Дан файл А, компоненты которого являются целыми числами. Записать в файл А1 все повторяющиеся числа файла А, а в файл А2 – числа, которые встречаются один раз. Порядок следования чисел сохраняется.

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

Исходный код:
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
# include <stdio.h>
# include <conio.h>
# include <string.h>
#define _CRT_SECURE_NO_WARNINGS
struct povtory
{
    char chislo[10];
    int colichestvo;
};
void main ()
{
    char buffer[10], pusto[10];
    char *eof="EOF";
    struct povtory mas[20];
    int i,b;
    FILE *A, *A1, *A2;
    A = fopen("D:\RBF\Input.txt", "r+t");
    do
    {
    fscanf (A, "%s", buffer);
    for (i=0; i<=20; i++) // Пункт 1 - общий цикл проверки
        {
        if (strcmp(buffer, mas[i].chislo)==0) // если число повторяется в конкретной записи, то в колонке "colichestvo" сооветствующей строки прибавляем 1
            {
            mas[i].colichestvo++; 
            i=20;
            }
        else  // если не повторяется в конкретной записи, то проверяем, не является ли оно EOF и если нет убеждаемся что оно не повторитя в других строках, для чего:   
            {
            if (strcmp(buffer, eof)!=0)
                {
                if (i==20) // проверяем, сканировали ли все строки структуры, если нет возвращаемся к Пункту 1, если да:
                for (b=0; b<=20; b++) // цикл поиска первой пустой строки в таблице-структуре и записи в неё нового, не повторявшегося нигде в таблице, числа
                    {
                        if (strcmp(mas[b].chislo, pusto)==0)  
                        strcpy(mas[b].chislo, buffer);
                    }
                }
            }
        } 
    }
    while (strcmp(buffer, eof)!=0);
}
При попытке запуска получаю ошибку:

Ошибка при попытке открытия для чтения текстового файла


Понимаю прекрасно, что скорее всего получился быдлокод, поэтому кроме советов по решению непосредственно этой проблемы, если кому не трудно, не отказался бы от общих советов по упрощению реализации конкретно этого кода, так и, если ошибки очень грубые, примерную схему как решить эту задачу проще совсем другим образом.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2014, 17:39
Ответы с готовыми решениями:

Segmentation fault при попытке чтения файла (которого нет)
Новичок в С. Сижу под линухом. Что-бы освоить аргументы командной строки и i/o файлов в С решил...

Ошибка при выносе чтения из файла в отдельную функцию
Код: #include &lt;stdio.h&gt; #pragma warning(disable:4996) char str; FILE *file; void gets()...

Программа крашится при попытке чтения числа с плавающей точкой
Первый пост, немного волнительно :) Помогаю другу с курсовой. Вчера он мне кинул код, который...

Ошибка при попытке открытия файла
Добрый день. При выполнении функции открытия файла F.open(adr,ios::in) по несуществующему адресу...

Ошибка 103 при попытке чтения файла
Здравствуйте. После попытки чтения выдается ошибка runerror 103. Что нужно исправить? procedure...

5
Max Dark
шКодер самоучка
2001 / 1767 / 871
Регистрация: 09.10.2013
Сообщений: 3,900
Записей в блоге: 6
Завершенные тесты: 2
23.10.2014, 17:50 2
Обратные слеши нужно дублировать, т.к. они являются признаком начала спец последовательности
C
1
fopen("D:\\RBF\\Input.txt", "r+t");
например последовательность \R означает возврат в начало строки и заменяется символом с кодом 0x10
1
Джаспер
0 / 0 / 0
Регистрация: 22.09.2014
Сообщений: 6
23.10.2014, 18:54  [ТС] 3
Устранил эту и ещё несколько ошибок, но программа теперь похоже стала бесконечно зацикленной. В чем может быть дело?

Исправленный код:

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
# include <stdio.h>
# include <conio.h>
# include <string.h>
#define _CRT_SECURE_NO_WARNINGS
struct povtory
{
    char chislo[10];
    int colichestvo;
};
void main ()
{
    char buffer[10], pusto[10];
    struct povtory mas[20];
    int i,b;
    FILE *A, *A1, *A2;
    A = fopen("D:\\RBF\\Input.txt", "r+t");
    do
    {
    fscanf (A, "%s", buffer);
    for (i=0; i<=20; i++) // Пункт 1 - общий цикл проверки
        {
        if (strcmp(buffer, mas[i].chislo)==0) // если число повторяется в конкретной записи, то в колонке "colichestvo" сооветствующей строки прибавляем 1
            {
            mas[i].colichestvo++; 
            i=20;
            }
        else  // если не повторяется в конкретной записи, то проверяем, не является ли оно EOF и если нет убеждаемся что оно не повторитя в других строках, для чего:   
            {
            if (strchr(buffer, EOF)==0)
                {
                if (i==20) // проверяем, сканировали ли все строки структуры, если нет возвращаемся к Пункту 1, если да:
                for (b=0; b<=20; b++) // цикл поиска первой пустой строки в таблице-структуре и записи в неё нового, не повторявшегося нигде в таблице, числа
                    {
                        if (strcmp(mas[b].chislo, pusto)==0)  
                        strcpy(mas[b].chislo, buffer);
                    }
                }
            }
        } 
    }
    while (strchr(buffer, EOF)==0);
    fclose(A);
    fclose(A1);
    fclose(A2);
}
0
kiff20072008
57 / 57 / 23
Регистрация: 28.09.2012
Сообщений: 358
23.10.2014, 18:55 4
Вы ведь понимаете что EOF это не "EOF"

так как вы делаете он будет считывать пока текст не закончится буквами EOF
0
Джаспер
0 / 0 / 0
Регистрация: 22.09.2014
Сообщений: 6
23.10.2014, 19:05  [ТС] 5
kiff20072008, в первоначальном коде была эта ошибка, но в переделанном, что в сообщении сразу над вашим, по идее должен был её исправить, используя для проверки вместо ошибочной строки:

C
1
while (strcmp(buffer, eof)!=0);
Строку:

C
1
while (strchr(buffer, EOF)==0);
Или это тоже не правильно?
0
kiff20072008
57 / 57 / 23
Регистрация: 28.09.2012
Сообщений: 358
23.10.2014, 19:12 6
Джаспер, по идее можно просто смотреть что вернул fscanf
если EOF то все
0
23.10.2014, 19:12
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2014, 19:12

При попытке чтения ini файла возникает ошибка
При выполнении программы возникает ошибка, как ее исправить? #include &lt;windows.h&gt; void...

Http сервер и клиент. При попытке получить ответ клиента от сервера ошибка: Поток был недоступен для чтения
Здравствуйте, пытаюсь разобраться с написанием клиент-серверного приложения используя сокеты....

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


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

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

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