1

Тема: Обробка текстового файлу

Допоможіть будь ласка створити програму, отже, дано текстовий файл. Змінити в ньому всі пробіли, що йдуть підрят на один пробіл.
дякую наперед!

2

Re: Обробка текстового файлу

Пане, ви, коли реєструвалися, мали змогу прочитати правила, а потім ще й галочку поставили, що з ними погоджуєтеся. А в правилах рівно одна картинка є. От що вам заважало ту картинку переглянути?

3

Re: Обробка текстового файлу

Вибачте, не доглядів, на наступний раз буду уважніший

4 Востаннє редагувалося Ярослав (14.03.2014 16:22:39)

Re: Обробка текстового файлу

Ось приблизний код, я, на жаль, прямо зараз не маю доступу до IDE, тому не зміг зневадити, але ви самі спробуйте, тут не має бути важко:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STRING_NUMBER 100
#define MAX_STRING_LENGTH 128
#define MAX_COLUMNS 5
#define OUTPUT_AREA 60

/* string_buffer: space for carrying lines
 */
char string_buffer[MAX_STRING_NUMBER][MAX_STRING_LENGTH];

/* ws_replace: reads lines from file, adds \0 to each line,
 * replaces white spaces in sequence by 1 space character,
 * saves lines where ptr_to_string points,
 * returns number of read lines or -1 if there was an error
 */
int ws_replace(char **ptr_to_string, int size_of_string);


int main(int argc, char** argv) {
    int nlines = 0; // number of lines
    char *string_ptr[MAX_STRING_NUMBER];
    
    string_ptr[0] = string_buffer[0];
    if((nlines = ws_replace(string_ptr, MAX_STRING_LENGTH)) != -1){
        printf("There was %d string(s) operated successfully\n", nlines);
    } else {
        return (EXIT_FAILURE);
    }
    
    return (EXIT_SUCCESS);
}

int ws_replace(char **pointer_to_string, int size_of_string){
    FILE *fp; // file pointer
    char c;
    char templine[MAX_STRING_LENGTH];
    int i, j, k; // variables for loop
    int nlines; // number of read lines

    /* opening file for reading */
    fp = fopen("user_strings.txt", "r");
    if(fp == NULL) {
        perror("Error opening file");
        return (-1);
    }
    
    /* writing lines into the user-defined space */
    for( nlines = 0;
         fgets(*(pointer_to_string+nlines), size_of_string, fp) != NULL;
         nlines++ ){
         printf("Operating line: %s", *(pointer_to_string+nlines));
    }
    
    /* closing file */
    fclose(fp);
    
    /* Adding \0 to the end of lines
     */
    for(i = 0, j = 0; i < nlines; i++){
        /* moving j to the end of current line */
        while(( ( c = *(*(pointer_to_string+i)+j) ) != '\n' || c != '\0' ) &&
                  j < MAX_STRING_LENGTH ){
            j++;
        }
        if(j != MAX_STRING_LENGTH){
            *(*(pointer_to_string+i)+j+1) = '\0';
        } else {
            *(*(pointer_to_string+i)+j) = '\0';
        }
        j = 0;
    }
    /* Replaceing ws in sequence by single space */
    for(i = 0, j = 0, k=0; i < nlines; i++){
        while( *(*(pointer_to_string+i)+j) != '\n' || 
               *(*(pointer_to_string+i)+j) != '\0' ){
            if(*(*(pointer_to_string+i)+j) != ' '){ 
                templine[j] = *(*(pointer_to_string+i)+j);
            } else if (*(*(pointer_to_string+i)+j) == ' ' && 
                                *(*(pointer_to_string+i)+j+1) != ' '){
                templine[j] = *(*(pointer_to_string+i)+j);
            }
            j++;
        }
        j = 0;
        while(templine[j] != '\n' || templine[j] != '\0'){
        *(*(pointer_to_string+i)+j) = templine[j];
        }
        j = 0;
    }
    return nlines;
}

5

Re: Обробка текстового файлу

Пан - великий майстер збочень...

FILE *infile, *outfile;
...
int in, wasSpace = 0;
while( ( in = fgetc( infile ) ) != EOF )
{
    if( ( in != ' ' ) || !wasSpace )
      fputc( in, outfile );
    wasSpace = ( in == ' ' );
}
...
rename(...);

6

Re: Обробка текстового файлу

koala, мій код насправді виглядає монстроподібним в порівнянні із вашим, я мав сирець і його переробив під цю задачу, але ваш підхід безумовно кращий :)

7

Re: Обробка текстового файлу

Дякую за допомогу ;)