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

Сортировка номеров машин с записью в файл - C++

Восстановить пароль Регистрация
 
The_Rock
Сообщений: n/a
05.03.2012, 11:24     Сортировка номеров машин с записью в файл #1
Задание было такое:
Составить программу, определяющую вид регистрационного номера автомобиля.
Номер может быть обычным, специальным и не соответствующим правилам.
Обычный номер начинается двумя или тремя цифрами, после которых следуют три больших латинских буквы.
Например: «367ARZ», «82ZBG».
Специальные номера имеют длину до 9 знаков, номер должен заканчиваться хотя бы одной цифрой, остальные символы - большие латинские буквы.
Например: «MEDIA782», «R2», «MARIKA1».
Создать текстовый файл с номерами различного типа (минимум 15).
Имя файла задаётся программе в командной строке.
Программа считывает номера и создаёт новый файл, где в первой строке задано имя исходного файла, каждая следующая строка содержит номер, его тип и пояснение, если данный номер не является обычным.

Имею код, полностью рабочий, для сортировки номеров.
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
#include <iostream>
#include <stdio.h>
#include <string.h>
 
using namespace std;
 
char * kontrolli( char * input) {
 
    // eemaldame inputist tГјhikud
    char f_input[80];
    int j = 0;
    for (int i = 0; i <= strlen(input); i++) {
        if (i == strlen(input)) {
            f_input[j] = '\0';
            break;
        }
        else if (input[i] != ' ' and input[i] != '\t') {
            f_input[j] = input[i];
            j++;
        }
    }
 
    // kontrollime pikkust
    if ( strlen( f_input ) > 9) {
        // liiga pikk
        return "reeglitele mittevastav";
    }
    else {
 
        for (int i = 0; i < strlen( f_input ); i++) {
            if (!isalnum(f_input[i])) {
                // sisaldab lubamatuid tahemarke
                return "reeglitele mittevastav";
            }
        }
    }
 
    // tavaline numbrimark
    int numbreid = 0;
    int tahti = 0;
 
    bool numbrid_otsas = false;
 
    if ( strlen( f_input ) == 6 || strlen( f_input ) == 5) {
        for (int i = 0; i < strlen( f_input ); i++) {
 
            // alguses peavad olema numbrid
            if( !numbrid_otsas && isdigit( f_input[i] ) ) {
                numbreid += 1;
            }
            else {
                numbrid_otsas = true;
            }
 
            // lГµpus peab olema 3 tГ¤hte
            if (numbrid_otsas) {
                if (isalpha(f_input[i])) {
                    tahti += 1;
                }
            }
        }
    }
 
 
    if (tahti == 3 && (numbreid == 2 or numbreid == 3)) {
        return "tavaline";
    }
    else {
        // kontrollime erinumbreid
        // peab olema Гјks number
 
        tahti = 0;
        numbreid = 0;
        for (int i = 0; i < strlen( f_input ); i++) {
            if (isdigit(f_input[i])) {
                numbreid += 1;
            }
            else if (isalpha(f_input[i])) {
                tahti += 1;
            }
        }
 
        if (numbreid > 0 and tahti > 0) {
            return "eritellimusel tehtud";
        }
    }
 
 
    return "reeglitele mittevastav";
}
 
int main()
{
    const char * data[] = {
        "367ARZ", "82ZBG", "MEDIA7", "R2", "MARIKA1", "jfkl;", "ABD232", "da234", "32df",
        "jjfksadljfkldsfl", "2232424234", "123456789", ";.,.", "234 adf"};
 
    int total_size, tmp_size;
    total_size = sizeof( data );
    tmp_size = 0;
 
    for (int i = 0; tmp_size < total_size; i++) {
        printf("%20s | %s\n", data[i], kontrolli( (char *) data[i] ));
        tmp_size += sizeof(data[i]);
    }
 
    return 0;
}
Проблема в том, что номера он берёт из массива как видите, и выводит на экран
const char * data[] = {
"367ARZ", "82ZBG", "MEDIA7", "R2", "MARIKA1", "jfkl;", "ABD232", "da234", "32df",
"jjfksadljfkldsfl", "2232424234", "123456789", ";.,.", "234 adf"};
А нужно, чтобы брал из файла, и записывал в другой файл, как в задании. Никак не могу реализовать.
Из файла номера вытаскиваю таким образом
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
int main () {
  string line;
  ifstream myfile ("avtonomer.txt");
  if (myfile.is_open())
  {
    while ( myfile.good() )
    {
      getline (myfile,line);
      cout << line << endl;
    }
    myfile.close();
  }
 
  else cout << "Unable to open file";
 
  return 0;
}
Тоже вытаскиваются без ошибок, хорошо.
Как соединить эти два кода вместе и сделать вывод данных в другой файл - ума не приложу. Уже десятки вариантов перепробовал, ничего не работает. В С++ я абсолютный новичек, поэтому не пинайте, если спрашиваю глупый вопрос.

Добавлено через 16 часов 33 минуты
Неужели никто не в курсе как такое решить?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
05.03.2012, 11:50     Сортировка номеров машин с записью в файл #2
Ну вы считали их из массива
C++
1
getline (myfile,line);
и вывели в консоль
C++
1
cout << line << endl;
Используйте вместо cout дескриптор вашего открытого файла -
C++
1
2
ofstream outputfile ("outputfile.txt");
outputfile << outputValue;
Из файла номера вытаскиваю таким образом
Как говориться, как "вытаскиваете", так и "втаскивайте".
Если бы Вы это все сами написали, я сомневаюсь, что сюда бы написали такой банальный вопрос.

Почитайте:
std::ofstream
Вообще полезный ресурс.
The_Rock
Сообщений: n/a
05.03.2012, 14:43     Сортировка номеров машин с записью в файл #3
zulkis спасибо за ответ. Я пошел другим путём, и сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
{
    FILE*sisend;  // File Control Block
    sisend = fopen("avtonomer.txt","rt");  // rt = Read Text
    if(sisend==NULL)
    {
        printf("Faili ei saa avada!\n");
        return 1;
    }
    while( not feof(sisend) )  // not End Of File
    {
        char data[100];
        fgets(data,100,sisend);
        
FILE*valjund = fopen("Tulemused.txt","wt");
        fprintf(valjund, "%20s | %s\n", data, kontrolli( (char *) data ));
    }
    return 0;
}
Из файла данные считываются, в другой записываются, всё ок. Только всё пишется косо, с ошибками. Жирным выделил то, что убрал из начального кода вывода, потому что с ним программа не работает. Или это важная часть кода? Как корректно записать вывод?

int total_size, tmp_size;
total_size = sizeof( data );
tmp_size = 0
;
FILE*valjund = fopen("Tulemused.txt","wt");
for (int i = 0; tmp_size < total_size; i++) {
fprintf(valjund, "%20s | %s\n", data[i], kontrolli( (char *) data[i] ));
tmp_size += sizeof(data[i]);
}
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
05.03.2012, 15:11     Сортировка номеров машин с записью в файл #4
А вы попробуйте обратно добавить и посмотреть что изменится, и вообще - по шагам, по шагам, в дебагере. Каждую функцию в гугл, смотрите описание, что делает, для чего конкретно нужна. Глядишь и понимание придет.
Yandex
Объявления
05.03.2012, 15:11     Сортировка номеров машин с записью в файл
Ответ Создать тему
Опции темы

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