Консультация № 180398
22.10.2010, 05:49
0.00 руб.
0 4 2
Уважаемые эксперты, помогите с задачей.

Программа считывает файл, а в выходной файл записывает только текст, заключенный в фигурные скобки.

Обсуждение

Неизвестный
22.10.2010, 07:11
общий
это ответ
Здравствуйте, Посетитель - 339752!

Программа консольная.

Читает данные по 256 байт, обрабатывает и пишет в файл.
Имена файлов просит как параметры программы с командной строки.
Вложенные скобки тоже пишет в файл. Но если закомментировать условия на iLevel перед continue - не будет писать.
Если находит закрывающую скобку раньше - игнорирует её, как обычный символ.

Приложение:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[])
{
if(argc<3)
{
printf("Format: input_file_name output_file_name\n");
return 1;
}

// OPEN FILES
FILE *fptrInput = fopen(argv[1], "rb");
FILE *fptrOutput = fopen(argv[2], "wb");

char szBrackets[3] = "{}";
int iLevel = 0;

if(fptrInput && fptrOutput)
{
// MOVE TO HEAD
fseek(fptrInput, 0, SEEK_SET);

//
char szInput[256] = "";
char szOutput[256] = "";
char *pszIn = NULL;
char *pszOut = NULL;
int iSize;
while(1)
{
// READ DATA
iSize = fread(szInput, sizeof(char), 256, fptrInput);
if(iSize)
{
pszIn = szInput;
pszOut = szOutput;

// PROCESS DATA
for(int i = 0; i<iSize; i++, pszIn++)
{
if(*pszIn == szBrackets[0])
{
iLevel++;
if(iLevel == 1)
continue;
}
if(*pszIn == szBrackets[1])
{
iLevel--;
if(iLevel == 0)
continue;
}
if(iLevel<0)
iLevel = 0;

// IF FIND BRACKET YET - REMEMBER DATA
if(iLevel)
*pszOut++ = *pszIn;
}

// WRITE DATA, IF WE HAVE ANY
if(pszOut != szOutput)
fwrite(szOutput, sizeof(char), pszOut-szOutput, fptrOutput);
}
// CHECK END OF FILE WE READ
if(feof(fptrInput))
break;
}

//
fclose(fptrInput);
fclose(fptrOutput);
}
else if(fptrOutput)
{
fclose(fptrOutput);
printf("can't open input file\n");
}
else
{
fclose(fptrInput);
printf("can't open output file\n");
}

return 0;
}
5
Неизвестный
22.10.2010, 19:10
общий
это ответ
Здравствуйте, Посетитель - 339752!
Программа. Проверял GCC.
Для ввода/вывода использовать перенаправление: "имя программы" <"входной файл" >"выходной файл"
Код:
#include <iostream>
#include <string>

using namespace std;

int main()
{
// Уровень вложения скобок
int level = 0;

wstring tmp;
wchar_t ch;

while (wcin.get(ch))
{
switch (ch)
{
case L'{':
{
if (level++ == 0)
{
tmp.clear();
}
break;
}
case L'}':
{
if (level > 0 && --level == 0)
{
wcout << tmp;
}
break;
}
default:
{
tmp += ch;
}
}
}
wcout << endl;
return 0;
}
5
Неизвестный
23.10.2010, 16:42
общий
Сандров Алекс:
spasibo
Неизвестный
23.10.2010, 16:42
общий
Micren:
spasibo
Форма ответа