Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
den-nokia
1 / 1 / 0
Регистрация: 26.04.2010
Сообщений: 31
1

Создание, запись, чтение файла. Массивы, циклы. Где-то ошибка.

24.11.2010, 15:49. Просмотров 1499. Ответов 3
Метки нет (Все метки)

Написал код небольшой программы, но где-то допустил ошибку. Не понимаю всех тонкостей, пожалуйста, объясните. Программа для подсчёта всех троечников (хотя бы одна тройка, но без двоек) в матрице из 10 строк и 4 столбцов – оценки 10 сту-дентов группы за сессию (4 экзамена в сессии). Где данные матрицы сначала заносятся в файл, затем считываются из файла. В конец файла дописывается число троечников.

Assembler
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
.386 
.model flat, stdcall 
option casemap:none 
include windows.inc 
include kernel32.inc 
includelib user32.lib 
includelib kernel32.lib 
NOFDIG equ 40 
DSIZE equ 4 
BSIZE equ NOFDIG*DSIZE
DIGSZ equ 10
ExitProcess proto:DWORD
.data 
fName BYTE "text_file",0 
fmt BYTE "%d",0
fHandle DWORD ? 
stdout DWORD ? 
cRead DWORD ?
cWritten DWORD ?
cWrite DWORD ?
x BYTE ? ; количество троек у студента
buf BYTE BSIZE dup (?) 
dig2sim BYTE DIGSZ dup (?) 
digs BYTE 1,2,3,4, 
           5,4,3,2, 
           5,3,4,3, 
           4,4,3,2,
           5,5,2,2,
           1,2,3,4, 
           5,4,3,2, 
           5,3,4,3, 
           4,4,3,2,
           5,5,2,2 
.code
start: 
 
; создаём файл и записываем туда элементы матрицы
 
            invoke CreateFile, ADDR fName, 
            GENERIC_WRITE, 
            0, NULL, CREATE_ALWAYS, 
            FILE_ATTRIBUTE_ARCHIVE, 0 
            mov fHandle, eax 
            invoke WriteFile, fHandle, ADDR digs,BSIZE, 
            ADDR cWritten, NULL 
            invoke CloseHandle, fHandle 
 
; читаем записанный файл и выводим на экран
 
            invoke GetStdHandle, STD_OUTPUT_HANDLE 
            mov stdout, eax 
            invoke CreateFile, ADDR fName, 
            GENERIC_READ, 
            0, NULL, OPEN_EXISTING, 
            FILE_ATTRIBUTE_NORMAL, 0
            mov fHandle, eax 
            invoke ReadFile, fHandle, ADDR buf,
            BSIZE, ADDR cRead, NULL 
            mov ecx, NOFDIG 
            mov esi, 0 
nxt: 
            push ecx 
            invoke wsprintf, ADDR dig2sim,
            ADDR fmt, buf[esi] 
            invoke WriteConsoleA, stdout, 
            ADDR dig2sim,
            DIGSZ, ADDR cWritten, NULL 
            add esi, 4 
            pop ecx 
            loop nxt 
            invoke CloseHandle, fHandle
 
; подчитываем число троешников
 
            xor eax, eax
            xor ebx, ebx
            xor ecx, ecx
            xor edx, edx
            xor esi, esi
            mov al, 0 ; количество строешников (строк)
 
; внешний цикл по строкам
 
            mov cx, 10 ; счётчик внешнего цикла
            mov ebx, 0 ; смещение
L:
            mov dx, cx ; запоминание cx внешнего цикла
 
; внутренний цикл по столбцам
 
            mov cx, 4 ; задание счётчика внут. цикла
            mov si, 0 ; индекс элемента внутри строки
L1:           
            mov ah, digs[ebx][esi] ; заносим элемент в ah
            mov ax, 2 ; сравниваемая оценка
            cmp ah, ax ; сравниваем оценку с двойкой
            ja bolshe ; если больше, переходим
            jmp L2 ; не больше, заканчиваем цикл
bolshe:
            mov ax, 3 ; сравниваемая оценка
            cmp ax, digs[ebx][esi] ; сравниваем оценку с тройкой
            je ravno ; если равно, то переходим
            jmp L2 ; не равно, заканчиваем цикл
ravno:
            add x, 1 ; учёт тройки
L2:         
            LOOP L1 ; внутренний цикл 4 раза
            mov ax, x ; переносим количество троек для сравнения
            mov ah, 0 ; для определения троешника
            cmp ax, ah ; сравниваем, есть тройки или нет
            ja yes ; больше 0 (есть тройки), переходим
            jmp L3 ; если нет, переходим
yes:
            inc al ; учёт троешника (строки)
L3:
            mov x, 0 ; очищаем x
            mov ax, 0 ; очищаем ax
            mov ah, 0 ; очищаем ah
            mov cx, dx ; восстановить cx для внешнего цикла
            add ebx, 4 ; на начало следующей строки
            LOOP L ; внешний цикл 10 раз
            mov x, al ; перемещаем количество троешников в переменную
            xor eax, eax ; очищаем eax
 
; записываем в файл результаты исследования
 
            invoke CreateFile, ADDR fName, 
            GENERIC_READ+GENERIC_WRITE, 
            0, NULL, OPEN_EXISTING, 
            FILE_ATTRIBUTE_NORMAL, 0 
            mov fHandle, eax 
            invoke SetFilePointer, fHandle, 1, 
            NULL,FILE_END
            invoke ReadFile, fHandle, ADDR buf, 
            BSIZE, ADDR cRead, NULL 
            invoke SetFilePointer, fHandle, 1, 
            NULL,FILE_END 
            invoke WriteFile, fHandle, ADDR x, 
            1, ADDR cWrite, NULL 
            invoke WriteFile, fHandle, ADDR buf, 
            cRead, ADDR cWrite, NULL 
            invoke CloseHandle, fHandle
 
invoke ExitProcess, 0 
end start
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2010, 15:49
Ответы с готовыми решениями:

Запись и чтение строк из файла
Нужно доработать код! Задание полное таково: создать файл, вбить в него две...

Создание файла и запись в него строки символов
Создание файла. В текущем каталоге диска создать файл с именем MYFILE.001 и...

Запись и чтение файла
Нужно записать и прочитать файл с лазерного диска не пользуясь командой...

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

Создание и чтение файла
Товарищи, подскажите как можно создать файл и записать в файл в PE формате. Так...

3
alexcoder
1844 / 714 / 149
Регистрация: 03.06.2009
Сообщений: 4,295
Завершенные тесты: 1
24.11.2010, 20:36 2
Assembler
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
.386 
.model flat, stdcall 
option casemap:none 
include windows.inc 
include kernel32.inc 
includelib user32.lib 
includelib kernel32.lib 
NOFDIG equ 40 
DSIZE equ 4 
BSIZE equ NOFDIG*DSIZE
DIGSZ equ 20
ExitProcess proto:DWORD
.data 
fName BYTE "text_file",0 
fmt BYTE "%d",0
fHandle DWORD ? 
stdout DWORD ? 
cRead DWORD ?
cWritten DWORD ?
cWrite DWORD ?
x BYTE ? ; количество троек у студента
buf BYTE BSIZE dup (?) 
dig2sim BYTE DIGSZ dup (?) 
digs BYTE 1,2,3,4, 
                   5,4,3,2, 
                   5,3,4,3, 
                   4,4,3,2,
                   5,5,2,2,
                   1,2,3,4, 
                   5,4,3,2, 
                   5,3,4,3, 
                   4,4,3,2,
                   5,5,2,2 
.code
start: 
 
; создаём файл и записываем туда элементы матрицы
 
                        invoke CreateFile, ADDR fName, 
                        GENERIC_WRITE, 
                        0, NULL, CREATE_ALWAYS, 
                        FILE_ATTRIBUTE_ARCHIVE, 0 
                        mov fHandle, eax 
                        invoke WriteFile, fHandle, ADDR digs,BSIZE, 
                        ADDR cWritten, NULL 
                        invoke CloseHandle, fHandle 
 
; читаем записанный файл и выводим на экран
 
                        invoke GetStdHandle, STD_OUTPUT_HANDLE 
                        mov stdout, eax 
                        invoke CreateFile, ADDR fName, 
                        GENERIC_READ, 
                        0, NULL, OPEN_EXISTING, 
                        FILE_ATTRIBUTE_NORMAL, 0
                        mov fHandle, eax 
                        invoke ReadFile, fHandle, ADDR buf,
                        BSIZE, ADDR cRead, NULL 
                        mov ecx, NOFDIG 
                        mov esi, 0 
nxt: 
            push ecx 
                        movzx eax,buf[esi]
                        invoke wsprintf, ADDR dig2sim,
                        ADDR fmt,  eax
                        invoke WriteConsoleA, stdout, 
                        ADDR dig2sim,
                        DIGSZ, ADDR cWritten, NULL 
                        add esi, 1 
                        pop ecx 
                        loop nxt 
                        invoke CloseHandle, fHandle
 
; подчитываем число троешников
 
                        xor eax, eax
                        xor ebx, ebx
                        xor ecx, ecx
                        xor edx, edx
                        xor esi, esi
                        mov al, 0 ; количество строешников (строк)
 
; внешний цикл по строкам
 
                        mov ecx, 10 ; счётчик внешнего цикла
                        lea ebx, digs ; смещение
L:
                        push ecx 
; внутренний цикл по столбцам
 
            mov ecx, 4 ; задание счётчика внут. цикла
            xor edx,edx
L1:           
                        cmp [ebx+ecx-1], byte ptr 2
                        ja bolse
                        inc dh                                              
bolse:                      cmp [ebx+ecx-1], byte ptr 3
                        jne L2 ; если равно, то переходим
                        inc dl
            L2:         LOOP L1 ; внутренний цикл 4 раза
                        pop ecx
                        test dh,dh
                        jnz L3
                        test dl,dl
                        jz L3
                        inc x
L3:                     add ebx,4
                        loop L
 
; записываем в файл результаты исследования
 
            invoke CreateFile, ADDR fName, 
                        GENERIC_READ+GENERIC_WRITE, 
                        0, NULL, OPEN_EXISTING, 
                        FILE_ATTRIBUTE_NORMAL, 0 
                        mov fHandle, eax 
                        invoke SetFilePointer, fHandle, 1, 
                        NULL,FILE_END
                        invoke ReadFile, fHandle, ADDR buf, 
                        BSIZE, ADDR cRead, NULL 
                        invoke SetFilePointer, fHandle, 1, 
                        NULL,FILE_END 
                        invoke WriteFile, fHandle, ADDR x, 
                        1, ADDR cWrite, NULL 
                        invoke WriteFile, fHandle, ADDR buf, 
                        cRead, ADDR cWrite, NULL 
                        invoke CloseHandle, fHandle
 
invoke ExitProcess, 0 
end start
1
xOr
15 / 15 / 0
Регистрация: 16.10.2010
Сообщений: 39
24.11.2010, 21:42 3
запутался я в твоём алгоритме поиска троечников, поэтому написал свой + исправил ошибки, вроде, работает. Компилить надо под консоль!
Assembler
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
.386 
.model flat, stdcall 
option casemap:none 
include windows.inc 
include kernel32.inc 
includelib user32.lib 
includelib kernel32.lib 
NOFDIG equ 40 
DSIZE equ 4 
;BSIZE equ NOFDIG*DSIZE
DIGSZ equ 10
ExitProcess proto:DWORD
.data 
fName BYTE "text_file",0 
fmt BYTE "%d",0
fHandle DWORD ? 
stdout DWORD ? 
cRead DWORD ?
cWritten DWORD ?
cWrite DWORD ?
x BYTE ? ; количество троек у студента
dig2sim BYTE DIGSZ dup (?) 
digs BYTE 1,2,3,4, 
                   5,4,3,2, 
                   5,3,4,3, 
                   4,4,3,2,
                   5,5,2,2,
                   1,2,3,4, 
                   5,4,3,2, 
                   5,3,4,3, 
                   4,4,3,2,
                   5,5,2,2 
BSIZE dd $-digs
buf BYTE $-digs+2 dup (?)
.code
 
start: 
 
; создаём файл и записываем туда элементы матрицы
 
                        invoke CreateFile, ADDR fName, 
                        GENERIC_WRITE, 
                        0, NULL, CREATE_ALWAYS, 
                        FILE_ATTRIBUTE_ARCHIVE, 0 
                        mov fHandle, eax 
                        invoke WriteFile, fHandle, ADDR digs,BSIZE, 
                        ADDR cWritten, NULL 
                        invoke CloseHandle, fHandle 
 
; читаем записанный файл и выводим на экран
 
                        invoke GetStdHandle, STD_OUTPUT_HANDLE 
                        mov stdout, eax 
                        invoke CreateFile, ADDR fName,GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
                        mov fHandle, eax 
                        invoke ReadFile, fHandle, ADDR buf, BSIZE, ADDR cRead, NULL 
                        mov ecx, NOFDIG
                        mov esi, 0
nxt: 
            push ecx 
                            invoke RtlZeroMemory,addr dig2sim,10 
                        invoke wsprintf, ADDR dig2sim,ADDR fmt, buf[esi] 
                        invoke WriteConsoleA, stdout, ADDR dig2sim, 10, ADDR cWritten, NULL ;лучше сделать цикл и выводить по 4, а затем делать переход на след. строку
                        add esi, 1
                        pop ecx 
                        loop nxt 
                        invoke CloseHandle, fHandle
 
; подсчитываем число троечников
 
                        xor eax, eax
                        xor ebx, ebx
                        xor ecx, ecx
                        xor edx, edx
                        xor esi, esi
                        mov al, 0 ; количество строек у ученика
a:
                        xor ebx, ebx 
L:
    .if esi<36 ;по строкам
        .if ebx<4 ;по столбцам
            .if digs[ebx][esi]==3
            inc ebx
            inc al
            jmp L
            .endif
                .if digs[ebx][esi]<=2
                        add esi,4
                        xor al,al
                        jmp a
                    .else ;число >3
                        inc ebx
                        jmp L
                .endif
        .else ;ebx=4
                .if al>0 ;есть тройки и нет 1 и 2?
                    inc x ;записываем ученика в троечники
                .endif
                add esi,4 ;переходим к следующему ученику
                xor al,al
                jmp a
        .endif
    .endif
 
            invoke CreateFile, ADDR fName,  GENERIC_READ+GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 
                        mov fHandle, eax 
                        invoke SetFilePointer, fHandle, BSIZE, NULL,FILE_BEGIN  
                        invoke WriteFile, fHandle, addr x,1, ADDR cWrite, NULL 
                        invoke CloseHandle, fHandle
          invoke Sleep,8000
invoke ExitProcess, 0 
end start
alexcoder - у меня красивее в файл пишет
1
den-nokia
1 / 1 / 0
Регистрация: 26.04.2010
Сообщений: 31
30.11.2010, 17:51  [ТС] 4
Хм.. а как можно сделать, чтобы эта программа записала в новый файл всех троечников?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2010, 17:51

Чтение файла, чтение названия папки где находится файл, запись данных на PHP
Допустим у нас есть структура с папками типа Large -&gt; Vehicles -&gt; Firetruck_0...

Массивы, запись и чтение из файла
Доброго времени суток, ребята! Прошу помощи с одной програмкой) Задание: ...

Динамические массивы и чтение/запись текстового файла
Здравствуйте. Имеется входной текстовый файл InputFile.txt. В нем задаётся...


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

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

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