Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Obsluga plikow tekstowych w C

Ostatnio zmodyfikowano 2014-05-16 15:22
Autor Wiadomość
okarynolot
Temat założony przez niniejszego użytkownika
Obsluga plikow tekstowych w C
» 2014-05-15 16:51:31
Hej.
Zadanie: Plik.txt zawierajacy ciagi danych w postaci cyfr 0 i 1, roznej dlugosci oraz puste linie, trzeba sformatowac
do postaci wyrownanych kolumn w/g klucza:

xxxx | xxxx | xxxx | xxxx |
xxxx | xxxx | xxxx | xxxx |
... itd.

Dane w pliku mniej wiecej wygladaja tak:

10011110001001001100100110110101011000101011111110101111011001100010001101000
1001000111111100101010100010010101110110011110001011011010110110110011101001001101010100110010001001101100100111011100011001110
/*nowa linia*/
100100101000100010100111110111011010110011111100100110110100010011110111010010001011111111000110111100011111010110111110011001010011
100101110100100010111011010011011100110011100100011010100101
/*nowa linia*/
0011111010001010011110010011101001111110110111001110011001100110111101100100101101001100110101111001
110111100010111011001111000111011110001001111001111101110100110110011001101001011000110111101011010100011011000101001111100101
101101111011011110010011000111000101010110010
/*nowa linia*/

...itd.

Probuje z funkcjami fprintf i fgetc fputc w petli, ale program wczytuje znak nowej linii i polyka 1 znak.

C/C++
#include<stdio.h>
#include<stdlib.h>


int main()
{
   
    FILE * src;
    FILE * dst;
    int c, i, j;
    char p = '|';
    char nl = '\n';
   
   
    src = fopen( "src.txt", "r" );
    dst = fopen( "dst.txt", "w" );
   
    while(( c = fgetc( src ) ) != EOF )
    {
        for( j = 0; j < 4; j++ )
        {
            for( i = 0; i < 4; i++ )
            {
                if( isdigit( c ) )
                     fputc( c, dst );
               
                c = fgetc( src );
               
            }
            fprintf( dst, "%c", 0x7C ); /*znak '|' - pipe */
        }
        fprintf( dst, "%c", 0x0A ); /*znak nowej linii*/
    }
   
    return 0;
}

Dla ulatwienia testow zastapilem ciag zerojedynkowy ciagiem regularnym {1,2,3,4,5,6,7,8,9,0}

1234|5678|9012|3456|
8901|2345|6789|0123|
5678|9012|3456|7890|
2345|6789|0123|4567|
901|2345|6789|0123|
5678|9012|3456|7890|
2345|6789|012|3456|
8901|2345|6789|0123|
5678|9012|3456|7890|
2345|6789|0123|4567|
9012|3456|7890|1234|
6789|012|3456|7890|
123|4567|8901|2345|
7890|1234|5678|9012|
4567|8901|2345|6789|
1234|5678|9012|3456|
8901|2345|6789|0123|
5678|901|2345|6789|
1234|5678|9012|3456|
8901|2345|6789|0123|
5678|9012|3456|7890|
2345|6789|0123|4567|
9012|3456|7890|1234|
6789|0123|4567|890|
2345|6789|0123|4567|
9012|3456|7890|1234|
6789|0123|4567|8901|
3456|7890|1234|5678|
01|2345|6789|0123|
5678|9012|3456|7890|
2345|6789|0123|4567|
9012|3456|7890|1234|
6789|0123|4567|8901|
3456|7890|1234|5678|
0123|4567|890||

Nie prosze o gotowe rozwiazanie, ale wskazowke do mojego podejscia, lub propozycje podejscia innego.
Z gory dzieki za odpowiedz!
P-110042
michal11
» 2014-05-15 17:19:39
Może spróbuj najpierw z całego pliku src usunąć entery i dopiero potem grupować znaki ?
P-110045
pekfos
» 2014-05-15 21:58:42
C/C++
for( i = 0; i < 4; i++ )
{
    if( isdigit( c ) )
         fputc( c, dst );
   
Inkrementujesz niezależnie od tego, czy coś wypisałeś.
P-110066
okarynolot
Temat założony przez niniejszego użytkownika
» 2014-05-16 14:34:43
Dzieki.
Usunalem "entery" jednym kodem:
[CPP]
/* remover.c */

#include<stdio.h>
#include<stdlib.h>

int main()
{

FILE* src;
FILE* dst;
int c, i,j;

src = fopen("src.txt", "r");
dst = fopen("dst.txt", "w");

while( (c = fgetc(src)) != EOF) {
if( !(c == 0x0A))

fputc(c, dst);
}

return 0;
}[/CPP]
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890

Drugim kodem probuje formatowac i w dalszym ciagu nie rozumiem dlaczego jeden znak wciaz wyparowuje... ????

C/C++
/* splitter.c*/

#include<stdio.h>
#include<stdlib.h>

int main()
{
   
    FILE * src;
    FILE * dst;
    int c, i, j;
   
    src = fopen( "dst.txt", "r" );
    dst = fopen( "final.txt", "w" );
   
    while(( c = fgetc( src ) ) != EOF ) {
       
       
        for( i = 0; i < 4; i++ ) {
           
           
            for( j = 0; j < 4; j++ ) {
               
                fputc( c, dst );
                c = fgetc( src );
            }
            fprintf( dst, "%c", 0x7C );
        }
        fprintf( dst, "%c", 0x0A );
    }
   
    return 0;
}

oto rezultat:
1234|5678|9012|3456|
8901|2345|6789|0123|
5678|9012|3456|7890|
2345|6789|0123|4567|
9012|3456|7890|1234|
6789|0123|4567|8901|
3456|7890|1234|5678|
0123|4567|8901|2345|
7890|1234|5678|9012|
4567|8901|2345|6789|
1234|5678|9012|3456|
8901|2345|6789|0123|
5678|9012|3456|7890|
2345|6789|0123|4567|
9012|3456|7890|1234|
6789|0123|4567|8901|
3456|7890|1234|5678|
0123|4567|8901|2345|
7890|1234|5678|9012|
4567|8901|2345|6789|
1234|5678|9012|3456|
8901|2345|6789|0123|
5678|9012|3456|7890|
2345|6789|0123|4567|
9012|3456|7890|1234|
6789|0123|4567|8901|
3456|7890|1234|5678|
0123|4567|8901|2345|
7890|1234|5678|9012|
4567|8901|2345|6789|
1234|5678|9012|3456|
8901|2345|6789|0123|
5678|9012|3456|7890|
2345|6789|0123|4567|
90ÿÿ|ÿÿÿÿ|ÿÿÿÿ|ÿÿÿÿ|

Jakies sugestie, Siostry i Bracia? :)
P-110110
okarynolot
Temat założony przez niniejszego użytkownika
» 2014-05-16 14:40:33
Sorki za blad z formatowaniem kodu.
Ma byc tak

remover.c:
C/C++
/* remover.c */

#include<stdio.h>
#include<stdlib.h>

int main()
{
   
    FILE * src;
    FILE * dst;
    int c, i, j;
   
    src = fopen( "src.txt", "r" );
    dst = fopen( "dst.txt", "w" );
   
    while(( c = fgetc( src ) ) != EOF ) {
        if( !( c == 0x0A ) )
       
             fputc( c, dst );
       
    }
   
    return 0;
}
P-110111
Adik80
» 2014-05-16 14:49:46
zamiast 2 programow poprostu zamien fory na zwykle liczniki

C/C++
int i = 0, j = 0;
while(( c = fgetc( src ) ) != EOF )
{
    if( c >= '0' && c < '9' )
    {
        fputc( c, dst );
        if( !( ++i % 4 ) )
        {
            fputc( '|', dst );
           
            if( !( ++j % 4 ) )
                 fputc( '\n', dst );
           
        }
    }
}
P-110112
okarynolot
Temat założony przez niniejszego użytkownika
» 2014-05-16 15:22:33
Skoro problem rozwiazany, zamykam! :)
P-110114
« 1 »
  Strona 1 z 1