Wątek zablokowany 2013-12-03 00:24 przez madmike.

Usuwanie linii zaczynających się od spacji

0

Hej :) Piszę program w C i mam problem z rozwiązaniem takiego zadania: "Modyfikując przedstawiony kod napisz program, który kopiując plik usuwa z niego linie zaczynające się od spacji. " Próbowałem sprawdzać pierwszy znak z linii, niestety skutek był taki, że tylko on był wyrzucany w nowym pliku. Proszę o pomoc .

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
	int wej, wyj;
	char znak;

	if(argc != 3) {
		puts("Uzycie: progr plik_wejsciowy plik_wyjsciowy");
		return 3;
	}
	wej = open(argv[1], O_RDONLY);
	if(wej < 0) {
		perror("Nie moge otworzyc pliku wejsciowego!");
		return 1;
	}
	wyj = open(argv[2], O_WRONLY|O_CREAT,0666);
	if(wyj < 0) {
		close(wej);
		perror("Nie moge utworzyc pliku wyjsciowego!");
		return 2;
	}
	while(read(wej,&znak,1) > 0) 
		write(wyj,&znak,1);
	close(wej);
	close(wyj);
	return 0;
}
0

Źle to robisz w takim razie. Wczytaj całą linijkę aż do znaku nowej linii a potem sprawdź pierwszy znak i zapisz całą linijkę albo nie zapisuj. Jak czytasz tak po znaku i od razu zapisujesz to oczywiste jest że to nie zadziała.

0

http://rosettacode.org/wiki/Read_a_file_line_by_line#C - tylko nie bierz pierwszego kodu, bo działa tylko pod BSD!!!

Gdzieś tak by to wyglądało:

#include <stdlib.h>    /* exit, malloc, realloc, free */
#include <stdio.h>    /* fopen, fgetc, fputs, fwrite */
 
struct line_reader {
    /* All members are private. */
    FILE    *f;
    char    *buf;
    size_t     siz;
};
 
/*
 * Initializes a line reader _lr_ for the stream _f_.
 */
void
lr_init(struct line_reader *lr, FILE *f)
{
    lr->f = f;
    lr->buf = NULL;
    lr->siz = 0;
}
 
/*
 * Reads the next line. If successful, returns a pointer to the line,
 * and sets *len to the number of characters, at least 1. The result is
 * _not_ a C string; it has no terminating '\0'. The returned pointer
 * remains valid until the next call to next_line() or lr_free() with
 * the same _lr_.
 *
 * next_line() returns NULL at end of file, or if there is an error (on
 * the stream, or with memory allocation).
 */
char *
next_line(struct line_reader *lr, size_t *len)
{
    size_t newsiz;
    int c;
    char *newbuf;
 
    *len = 0;            /* Start with empty line. */
    for (;;) {
        c = fgetc(lr->f);    /* Read next character. */
        if (ferror(lr->f))
            return NULL;
 
        if (c == EOF) {
            /*
             * End of file is also end of last line,
        `     * unless this last line would be empty.
             */
            if (*len == 0)
                return NULL;
            else
                return lr->buf;
        } else {
            /* Append c to the buffer. */
            if (*len == lr->siz) {
                /* Need a bigger buffer! */
                newsiz = lr->siz + 4096;
                newbuf = realloc(lr->buf, newsiz);
                if (newbuf == NULL)
                    return NULL;
                lr->buf = newbuf;
                lr->siz = newsiz;
            }
            lr->buf[(*len)++] = c;
 
            /* '\n' is end of line. */
            if (c == '\n')
                return lr->buf;
        }
    }
}
 
/*
 * Frees internal memory used by _lr_.
 */
void
lr_free(struct line_reader *lr)
{
    free(lr->buf);
    lr->buf = NULL;
    lr->siz = 0;
}
 
/*
 * Read a file line by line.
 * http://rosettacode.org/wiki/Read_a_file_line_by_line
 */
int main(int argc, char *argv[]) {
    struct line_reader lr;
    size_t len;
    char *line;
    FILE *wej, *wyj;
    
    if(argc != 3) {
        puts("Uzycie: progr plik_wejsciowy plik_wyjsciowy");
        return 3;
    }
    wej = fopen(argv[1], "r");
    if(wej < 0) {
        perror("Nie moge otworzyc pliku wejsciowego!");
        return 1;
    }
    wyj = fopen(argv[2], "w");
    if(wyj < 0) {
        close(wej);
        perror("Nie moge utworzyc pliku wyjsciowego!");
        return 2;
    }
 
    /*
     * This loop reads each line.
     * Remember that line is not a C string.
     * There is no terminating '\0'.
     */
    lr_init(&lr, wej);
    while (line = next_line(&lr, &len)) {
        /*
         * Do something with line.
         */
        if (line[0]!=' ')        
            fwrite(line, len, 1, wyj);
    }
    if (!feof(wej)) {
        perror("next_line");
        exit(1);
    }
    lr_free(&lr);
    
    close(wej);
    close(wyj);
    return 0;
}
1
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main(int argc, char *argv[])
  {
   int wej,wyj,pierwszyznak=1,kopiuj=0;
   char znak;

   if(argc!=3) { puts("Uzycie: progr plik_wejsciowy plik_wyjsciowy"); return 3; }
   if((wej=open(argv[1], O_RDONLY))<0) { perror("Nie moge otworzyc pliku wejsciowego!"); return 1; }
   if((wyj=open(argv[2], O_WRONLY|O_CREAT,0666))<0) { close(wej); perror("Nie moge utworzyc pliku wyjsciowego!"); return 2; }
   while(read(wej,&znak,1)>0)
     {
      if(pierwszyznak) kopiuj=(znak!=' ');
      if(kopiuj) write(wyj,&znak,1);
      pierwszyznak=(znak=='\n');
     }
   close(wej);
   close(wyj);
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1