сортировка Txt

Тема в разделе "Общие вопросы по С и С++", создана пользователем -, 14 ноя 2010.

  1. Гость

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

    Вложения:

    • ishodnik.txt
      Размер файла:
      288 байт
      Просмотров:
      9
    • obr_ishodnik.txt
      Размер файла:
      169 байт
      Просмотров:
      7
  2. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

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

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

    Код (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`›помогите в двумерный сделат как то, хотя бы как в него считать
     
  4. Гость

    Код (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 открыл и записал, не получается
     
  5. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    В твоем примере есть ошибки (недочеты)

    Код (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();
    }
     
  6. Гость

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

    Код (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);



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

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Смотри в чем твои недочеты, я говорил читать по-строчно, ты читаешь просто все подряд ( и только 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);
    }
    Я как можно более менее прокомментировал, если есть вопросы пиши, всегда отвечу помогу...
     
Загрузка...

Поделиться этой страницей