• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

сортировка Txt

  • Автор темы Guest
  • Дата начала
G

Guest

Такой вопрос, господа. Есть файл txt ishodnik, его нужно открыть взять нужную инфу и записать в другой txt в определенное место, прокопался весь день, пробовал вытащить substring, вытащил, записал, но записал тупо в новый файл, как сделать , чтобы он например был в 8 строке с отступом в 20 пробелов не нашел. Потом взялся за потоки, считал все fread в массив, потом fprint хотел записать нужные элементы массива куда нужно, благо читал, что она это умеет и не нашел...помогите пожалуйста, в приложении исходник и что должно из него получится, писать прогу за меня не прошу, прошу лишь указать как это делать, желательно примером, спасибо
 

Вложения

  • ishodnik.txt
    288 байт · Просмотры: 519
  • obr_ishodnik.txt
    169 байт · Просмотры: 320
D

DarkKnight

Вообщем делаешь так...
Читаешь весь файл по-строчно в массив типа char[K][N] , где к-кол-во строк зайдай много что бы было, а N - это максимальное кол-во символов в строке
Потом меняешь в массиве данные так как ты хотел что бы они записались, и пишишь массив в файл...
Я использую STL поэтому использую потоковый файловый ввод-вывод
#include <fstream>
ifstream
ofstream

Добавлено: Если что то не получиться, напиши, я напишу реализацию..
 
G

Guest

C++:
FILE * f_in = fopen( "rinex.txt", "rb" );				 // открываем входной файл для чтения
if ( f_in == 0 )
{
ShowMessage("файл открыть не удалось");
return;
}
//----------------------------------------------------------
FILE * f_out1 = fopen( "rinexnew.txt", "wt" );	 // открыть 1-й выходной файл для записи
if ( f_out1 == 0 )
{
fclose( f_in );
ShowMessage("файл открыть не удалось");
return;
}
//-----------------------------------------------------------

unsigned char info_1[ 100 ];

fread( info_1, 1, 99, f_in );
info_1[100]='\0';


char a=info_1[2];
fprintf(f_out1,"%50s",&a);



fclose( f_in );
fclose( f_out1 );

}

}

ой, самый классный вариант все в двумерный массив запихнуть, а потом его упорядочить, я пока вот до чего дошел считываю поток первые 100 байт в массив, потом беру 2 байт и хочу ее вывести при помощи printf в определенном месте- получается билеберда...1pcj2Xcj2`›помогите в двумерный сделат как то, хотя бы как в него считать
 
G

Guest

C++:
{
int A[11][11] = { 0 };


FILE *input1 = fopen("1.txt","r");
FILE *out =fopen("2.txt", "w");



for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
fscanf(input1, "%s", &A[i][j]);

}

}
fprintf (out,"%s",&A);
fclose(input1);
fclose(out);



}  }

вот напсал код, чтоб матрицу 11 на 11 открыл и записал, не получается
 
D

DarkKnight

В твоем примере есть ошибки (недочеты)

C++:
	for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
fscanf(input1, "%s", &A[i][j]);
Тут в сканфе ты пытаешься прочесть строку, а массив у тебя int, следовательно меняешь %s на %c - прочитать символ

А я тебе говорил про такой пример:
C++:
#include <iostream>
#include <fstream>

using namespace std;
void main (void)
{
ifstream fl("ishodnik.txt"); //Открываем файл для чтения
char Array[1000][128]; //Наш массив
int CountStr = 0; //Кол-во строк в массиве
while (!fl.eof()) //Пока не достигнут конец файла
{
fl.getline(Array[CountStr],128); //Читаем по-строчно
CountStr++; //Увеличиваем кол-во строк
}
//Вот у нас получился массив строк, где например Array[1][2] - 3ий символ 2ой строки

//Предположим что нам нужно заменить какие то данные в строке 2 с 4ого символа, на строку из 4х символов
char d[]="Test"; //строка 4 символа - 5 ый завершающий
char *ptr = &Array[1][3]; //Возьмем указатель на 2ию строку 4ый символ
strncpy(ptr,d,4); //Скопируем строку d не более 4х символов с места накоторое указывает указатель ptr

//Вывод массива строк на экран
for (int i=0; i<CountStr; i++)
cout<<Array[i]<<endl;
fl.close();
}
 
G

Guest

нее в таких потоках я вообще не секу, а можем лучше мой вариант подправить, поменял s на c вске равно не пишет(
 
G

Guest

C++:
char A[11][11] = { 0 };


FILE *input1 = fopen("1.txt","r");
FILE *out =fopen("2.txt", "w");



for (int i = 0; i < 11; i++)
{
for (int j = 0; j < 11; j++)
{
fscanf(input1, "%c", &A[i][j]);


}
}
char d[]="Test"; //строка 4 символа - 5 ый завершающий
char *ptr = &A[1][3]; //Возьмем указатель на 2ию строку 4ый символ
strncpy(ptr,d,4);
fprintf (out,"%s",&A);
fclose(input1);
fclose(out);



}
}
воо, что-то получилось, по крайней в мере в массиве могу все, что нужно заменить, а подскажите, как создать пустой массив, размером как исходный, туда все что нужно класть, а потом его в файл вывести?
 
D

DarkKnight

Смотри в чем твои недочеты, я говорил читать по-строчно, ты читаешь просто все подряд ( и только 11*11 символов),нам же нужно прочитать весь файл,и не обрывать данные конца + нам интересно точное место (строка, индекс символа(байта)). Что бы читать построчно, нужно определять символ возврата корретки '\n', и только тогда увеличивать счетчик массива строк....

Вот как она должна выглядить + ответ на твой вопрос по созданию пустого массива с той же размерность.....
C++:
#include <iostream>
#include <fstream>
using namespace std;

void main (void)
{
setlocale(LC_ALL,"Russian"); 

char A[100][1000] = { 0 }; //Твой массив Максимум 100 строк по 1000 символов в каждой
char AOut[100][1000]; //Выходной массив, будем делать его пустым

FILE *input1 = fopen("1.txt","r");
FILE *out =fopen("2.txt", "w");
int CountStr = 0; //Счетчик строк
if (!input1)
{
cout<<"Error";
}

int i=0; //Счетчик позиции в строке
while(!feof(input1))//Пока не достигнуто конец файла чистаем по-символьно
{
fscanf(input1, "%c", &A[CountStr][i]); //Читаем символ
if (A[CountStr][i] == '\n') //Если символ является символом возврата корретки (переход на новую строку)
{
A[CountStr][i+1] = 0; //Поставим завершающий символ строки
AOut[CountStr][0] = 0; //Пустую строку создаем
CountStr++; //Увеличим счетчик строк
i = 0; //Позицию в строке обнулим
}
else i++; //Иначе увеличиваем счетчик позиций в строке
}

//На выходе у нас получается:
//CountStr - кол-во строк
//A - массив с данными первого файла с кол-вом строк CountStr
//AOut - массив строк (кол-во равно CountStr) все строки которые нулевые - пустые


fclose(input1);
fclose(out);
}
Я как можно более менее прокомментировал, если есть вопросы пиши, всегда отвечу помогу...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!