Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 18. 11. 2010 13:29 — Editoval StAniS (18. 11. 2010 13:35)

StAniS
Zelenáč
Příspěvky: 7
Reputace:   
 

Formátování textového souboru

Zdravím, potřeboval bych menší pomoc. Program by měl po zadaném počtu znaků zalámovat text, nemůžu text zalomit ve slovu tzn. že to musím zalomit v mezeře.

Code:

#include "stdafx.h"
#include <iostream>

using namespace std;

int get_lines(FILE *fr);

int main()
{
    FILE *fr, *fw, *fr_g;
    char c;
    int i = 1, n = 30, num_rows;

/*    printf("\nZadejte pocet znaku na radku: ");
    scanf("%d",&n);*/

    fr_g = fopen("C:/Lorem.txt", "r");
    fr = fopen("C:/Lorem.txt", "r");
    fw = fopen("C:/Lorem_NEW.txt", "w");

    num_rows = get_lines(fr_g);
    fclose(fr_g);

    cout << "Pocet radku ve vstupnim souboru: " << num_rows << endl;
    
    for (int j = 1; j <= num_rows; j++) {
        fprintf(fw,"   ");
        while ((c = getc(fr)) != '\n') {
            if (((i >= (n-10)) && (i <= 31)) && (c == ' ')) {
                fprintf(fw,"\n");
                i = 1;
            }
            else {
                fprintf(fw,"%c",c);
                i++;
            }
        }
        fprintf(fw,"\n");
        i = 0;
    }

    fclose(fr);
    fclose(fw);

    cout << endl << endl;
    system("pause");
    return 0;
}

int get_lines(FILE *fr)
{
    char c;
    int num_rows = 0;

    while ((c = getc(fr)) != EOF) {
        if (c == '\n') {
            num_rows++;
        }

    }

    return num_rows;
}

problémem je, že napříkald když máme text zalomit po max 30 znacích, tzn. mezi 20 a 30 znakma budu hledat mezeru, tak mi najde první mezeru po 20 a další nebere v potaz. Potřeboval bych to nějak vylepšit tak, aby bral tu poslední mezeru která bude k dispozici v intervalu mezi 20-30.
Díky za pomoc

EDIT: vstupní soubor je strukturovaný jako 1 řádek = ve výstupním souboru 1 odstavec

Offline

 

#2 18. 11. 2010 14:51

septolet
Příspěvky: 334
Reputace:   
 

Re: Formátování textového souboru

↑ StAniS:

Lze to udělat například takto. Místo toho, abys po nalezení mezery hned zalomil řádek, můžeš udělat to, že si budeš pamatovat index mezery. Projdeš řádku až do posledního znaku a poté zalomíš na takovém indexu, kde byla poslední mezera. Při tomhle řešení se budeš muset posouvat v souboru (funkce fseek).

Offline

 

#3 18. 11. 2010 15:28

ondrouchd
Příspěvky: 43
Reputace:   
 

Re: Formátování textového souboru

Souhlas a navic si cely ten algoritmus tak jak je jeste jednou projdi a oprav. Nefunguje ti tak, jak by mel.

Offline

 

#4 18. 11. 2010 18:00

StAniS
Zelenáč
Příspěvky: 7
Reputace:   
 

Re: Formátování textového souboru

nemohli by jste přímo upravit ten můj kód, už se o to pokouším přes 2 hodiny pomocí toho fseek a bezúspěchu, vždycky mi přepíše víc jak jeden znak :(

Offline

 

#5 19. 11. 2010 11:24

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: Formátování textového souboru

Jestli to jeste nemas, tak tady neco je, ale nerucim za to, ze je to naprosto spravne:

Code:

#include "stdafx.h"
#include <iostream>

using namespace std;

int get_lines(FILE *fr);

int main()
{
    FILE *fr, *fw, *fr_g;
    char c, Buffer[256];
    int i = 0, n = 30, num_rows, LastSpace;

/*    printf("\nZadejte pocet znaku na radku: ");
    scanf("%d",&n);*/

    fr_g = fopen("Input.txt", "r");
    fr = fopen("Input.txt", "r");
    fw = fopen("Output.txt", "w");

    num_rows = get_lines(fr_g);
    fclose(fr_g);

    cout << "Pocet radku ve vstupnim souboru: " << num_rows << endl;

    while (!feof (fr)){
      c = 0;
      fprintf(fw,"   ");
      while (c != '\n'){
          while (i < n) {
              c = getc(fr);
              if (c == ' ') LastSpace = i;
              if (c == '\n' || feof (fr)) {
                LastSpace = i;
                i++;
                break;
              }
              Buffer [i] = c;
              i++;
          }
          Buffer [LastSpace] = 0;
          fprintf(fw,"%s\n", Buffer);
          if (feof (fr)) break;
          fseek (fr, LastSpace - i + 1, SEEK_CUR);
          i = 0;
      }
    }
    fclose(fr);
    fclose(fw);

    cout << endl << endl;
    system("pause");
    return 0;
}

int get_lines(FILE *fr)
{
    char c;
    int num_rows = 1;

    while ((c = getc(fr)) != EOF) {
        if (c == '\n') {
            num_rows++;
        }

    }

    return num_rows;
}

Offline

 

#6 19. 11. 2010 14:56

StAniS
Zelenáč
Příspěvky: 7
Reputace:   
 

Re: Formátování textového souboru

j díky moc

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson