Сообщение было отмечено Памирыч как решение
Решение
Я думаю как-то так:
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
| #include <stdio.h>
int main()
{
FILE *fout, *fin;
int i;
const char strnum = 5, * const_str[ ] =
{
"1) first string",
"second (2) string",
"300 202 014",
"Error 404: page not found",
"A fatal exception OE has occurred at 0028:C02A0948 IN VXD VWIN32"
};
fout = fopen( "./out.txt", "w" );
if( !fout )
{
fputs( "error opening ./out.txt for writing", stderr );
return 1;
}
for( i = 0; i < strnum; i++ )
{
fputs( const_str[i], fout ); // пишем строки в файл
fputs( "\n", fout ); // перенос строки
}
fclose( fout );
puts( "Initial file written: ./out.txt" );
fin = fopen( "./out.txt", "r" );
if( !fin )
{
fputs( "error opening ./out.txt for reading", stderr );
return 2;
}
fout = fopen( "./out2.txt", "w" );
if( !fout )
{
fclose( fin );
fputs( "error opening ./out2.txt for writing", stderr );
return 2;
}
while( !feof( fin ) )
{
int ch = fgetc( fin ); // читаем символ из файла
if( isdigit( ch ) ) // если прочтённый символ - цифра
fputc( ch, fout ); // пишем её в файл
}
fclose( fout );
fclose( fin );
puts( "Numeric file written: ./out2.txt" );
return 0;
} |
|
Хотя, судя по vcl.h в списке заголовочников, можно было и на C++...
Добавлено через 53 минуты
Вот более красивый вариант - понимает дробные и отрицательные числа и каждое число выводит на своей строке.
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
109
110
111
112
113
114
| #include <stdio.h>
inline char isDot( char ch )
{
return ch == '.' || ch == ',';
}
inline char isDash( char ch )
{
return ch == '-';
}
int main()
{
FILE *fout, *fin;
int i;
const char strnum = 5, * const_str[ ] =
{
"1) first string - the very first one.",
"second (2) string",
"300 -202.08 14,485-15,2,4 .45 014, numeric one",
"Error 404: page not found",
"A fatal exception OE has occurred at 0028:C02A0948 IN VXD VWIN32"
};
fout = fopen( "./out.txt", "w" );
if( !fout )
{
fputs( "error opening ./out.txt for writing", stderr );
return 1;
}
for( i = 0; i < strnum; i++ )
{
fputs( const_str[i], fout ); // пишем строки в файл
fputs( "\n", fout ); // перенос строки
}
fclose( fout );
puts( "Initial file written: ./out.txt" );
fin = fopen( "./out.txt", "r" );
if( !fin )
{
fputs( "error opening ./out.txt for reading", stderr );
return 2;
}
fout = fopen( "./out2.txt", "w" );
if( !fout )
{
fclose( fin );
fputs( "error opening ./out2.txt for writing", stderr );
return 2;
}
while( !feof( fin ) )
{
char num[16] = {0};
char dash = 0, dot = 0;
// поиск первой цифры
num[0] = fgetc( fin );
dash = isDash( num[0] );
dot = isDot( num[0] );
if( !isdigit( num[0] ) && !dot && !dash )
continue;
//первая цифра найдена
//чтение оставшейся части числа
for( i = 1; i < 16; i++ )
{
num[i] = fgetc( fin );
dot += isDot( num[i] );
dash += isDash( num[i] );
//printf( "dot = %i, dash = %i, smb = %c\n", dot, dash, num[i] );
if( isDash( num[i] ) || ( !isdigit( num[i] ) && !isDot( num[i] ) ) || dot > 1 )
{
// если посередине числа лишняя точка или минус
if( isDash( num[i] ) || isDot( num[i] ) )
fseek( fin, -1, SEEK_CUR ); // отмотать курсор назад - нам нужно прочитать этот символ ещё раз, вдруг он - часть следующего числа?
num[i] = 0;
break;
}
}
// если у нас есть число (даже если это "-.156", что = "-0.156")
if( isdigit( num[0] ) || isdigit( num[1] ) || isdigit( num[2] ) )
{
fputs( num, fout ); //вывод числа
fputs( "\n", fout ); // перенос строки
}
// просто могут быть варианты вроде ".\n" или ",\n" или "-\n" - это не числа.
}
fclose( fout );
fclose( fin );
puts( "Numeric file written: ./out2.txt" );
return 0;
} |
|
Возможно, можно красивее - башка не варит.
Удачи.
Добавлено через 46 минут
Можно ещё лучше:
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
| #include <stdio.h>
int main()
{
FILE *fout, *fin;
int i;
const char strnum = 5, * const_str[ ] =
{
" 1) first string - the very first one.",
"second (2) string",
"300 -202.08 14,485-15,2,4 .45 014, numeric one",
"Error 404: page not found",
"A fatal exception OE has occurred at 0028:C02A0948 IN VXD VWIN32"
};
fout = fopen( "./out.txt", "w" );
if( !fout )
{
fputs( "error opening ./out.txt for writing", stderr );
return 1;
}
for( i = 0; i < strnum; i++ )
{
fputs( const_str[i], fout ); // пишем строки в файл
fputs( "\n", fout ); // перенос строки
}
fclose( fout );
puts( "Initial file written: ./out.txt" );
fin = fopen( "./out.txt", "r" );
if( !fin )
{
fputs( "error opening ./out.txt for reading", stderr );
return 2;
}
fout = fopen( "./out2.txt", "w" );
if( !fout )
{
fclose( fin );
fputs( "error opening ./out2.txt for writing", stderr );
return 2;
}
fseek( fin, 0, SEEK_SET );
while( !feof( fin ) )
{
// поиск начала числа
float num = 0.0f;
char ch = fgetc( fin );
char dig = isdigit( ch );
if( ch == '-' || ch == '.' || dig )
fseek( fin, -1, SEEK_CUR ); // первый символ нужно перечитать ещё раз
else if( !dig )
continue;
// чтение числа
if( fscanf( fin, "%f", &num ) )
{
char buff[16];
sprintf( buff, "%f", num ); //сформировать строку вывода
// отрезать нули справа
for( i = strlen(buff); i >= 0; i-- )
{
if( buff[i] == '.' )
{
buff[i] = 0;
break;
}
else if( buff[i] == '0' || !isdigit(buff[i]) )
buff[i] = 0;
else
break;
}
fputs( buff, fout ); //вывод числа
fputs( "\n", fout ); // перенос строки
}
}
fclose( fout );
fclose( fin );
puts( "Numeric file written: ./out2.txt" );
return 0;
} |
|
Не по теме:
Вот что бессонница с человеком делает...
2
|