Чтение строки и удаление пробелов из матрицы в файле - PullRequest
0 голосов
/ 07 мая 2019

ОК, так что мне удается записать в файл char на char, но он записывает вдвое больше чисел и все равно записывает его с пробелами. Любой совет и решение?

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
#include <ctype.h>
#include <fcntl.h>

extern int errno;
#define MAX_LEN 18

int main(int argc, char *argv[]) {
    int fd[2], des, bytes, target;
    char buffer[161];
    int fdr, fdw;   // file descriptors
    char c;

    fdr = open(argv[1],  O_RDONLY);   // open files
    fdw = open("gg.txt", O_WRONLY | O_CREAT);
    if (fdr < 0 || fdw < 0) {
        perror("failed to open input or output files");
        exit(EXIT_FAILURE);
    }

    while (read(fdr, &c, 1)) { // read/write a single char from/to the files
        if (c != ' ' && c != EOF) {
            if (write(fdw, &c, 1) != 1) {
                perror("write() failed");
                exit(EXIT_FAILURE);
            }
        }    // echo char to stdout
    }

    close(fdr);   // close the files
    close(fdw);
    exit(EXIT_SUCCESS);
}

РЕДАКТИРОВАТЬ РАЗДЕЛ

Привет еще раз,

Мне удалось прочитать файл и записать его в новый без пробелов, но я пытаюсь вставить значения в матрицу, но я получаю сообщение об ошибке, пытаясь открыть новый файл.

Я изменил разрешения

fdw = open("gg.txt", O_RDWR | O_CREAT | O_TRUNC, 0644);

функция

void removeSpaces(int matrix[SIZE][SIZE],int fdr, int fdw) {

    char c;
    char matBuffer={0};
    while (read(fdr, &c, 1))          // read/write a single char
    {                                  // from/to the files
        if (c != ' ') {
            if (write(fdw, &c, 1) != 1) {
                perror("write() failed");
                exit(EXIT_FAILURE);
            }
        }
    }
    int i;
    int j;
    int k=0;
    while(read(fdw, &matBuffer, 1))
    {
        for(i=0;i<SIZE;i++)
        {
            for(j=0;j<SIZE;j++)
                    {
                        matrix[i][j]=matBuffer-'0';
                        k++;
                    }
            k=0;
        }

    }

}

Вся программа

// C program to illustrate
// open system call
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
#include <ctype.h>
#include <fcntl.h>
#define MAX_LEN 18
#define SIZE 9
void removeSpaces(int matrix[SIZE][SIZE],int fdr, int fdw) {

    char c;
    char matBuffer={0};
    while (read(fdr, &c, 1))          // read/write a single char
    {                                  // from/to the files
        if (c != ' ') {
            if (write(fdw, &c, 1) != 1) {
                perror("write() failed");
                exit(EXIT_FAILURE);
            }
        }
    }
    int i;
    int j;
    int k=0;
    while(read(fdw, &matBuffer, 1))
    {
        for(i=0;i<SIZE;i++)
        {
            for(j=0;j<SIZE;j++)
                    {
                        matrix[i][j]=matBuffer-'0';
                        k++;
                    }
            k=0;
        }

    }

}
int is_safe(int matrix[9][9],int n, int r, int c)
{
    int i,j;
    //checking in row
    for(i=0;i<9;i++)
    {
        //there is a cell with same value
        if(matrix[r][i] == n)
            return 0;
    }
    //checking column
    for(i=0;i<SIZE;i++)
    {
        //there is a cell with the value equal to i
        if(matrix[i][c] == n)
            return 0;
    }
    //checking sub matrix
    int row_start = (r/3)*3;
    int col_start = (c/3)*3;
    for(i=row_start;i<row_start+3;i++)
    {
        for(j=col_start;j<col_start+3;j++)
        {
            if(matrix[i][j]==n)
                return 0;
        }
    }
    return 1;
}
int main(int argc, char * argv[]) {
    int pipe_descs[2];
    int matrix[SIZE][SIZE];
    int fdr, fdw;   // file descriptors
    int i,j;
/*  if (pipe(pipe_descs) == -1) {
        fprintf(stderr, "cannot open");
        exit(1);
    }
    pid_t status = fork();
    if(status ==0 )
    {

    }*/
    fdr = open(argv[1], O_RDONLY);   // open files
    fdw = open("gg.txt", O_RDWR | O_CREAT | O_TRUNC, 0644);
    if (fdr < 0 || fdw < 0) { //validation for error
        perror("failed to open input or output files");
        exit(EXIT_FAILURE);
    }
    removeSpaces(matrix,fdr, fdw);
    for(i=0; i<9; i++){    /* Iterate of each row */
        for(j=0; j<9; j++){    /* In each row, go over each col element  */
          printf("%c ",matrix[i][j]); /* Print each row element */
        }
        printf("\n");        /* Finish a row, start a new line */
      }
    close(fdr);   // close the files
    close(fdw);

    exit(EXIT_SUCCESS);
}

1 Ответ

1 голос
/ 08 мая 2019

В коде есть несколько проблем:

  • вы не проверяете на read ошибки, read может вернуть -1 для ошибки, которая не остановит цикл while.
  • тестирование c != EOF бессмысленно. EOF возвращается getc(), чтобы указать конец потока или ошибку ввода, read указывает эти условия в своем возвращаемом значении, c всегда является байтовым значением, если read успешно выполнено и возвращено 1.
  • gg.txt не усекается на open с указанными флагами. Скорее всего, вы перезаписываете начало файла, и по какой-то причине он длиннее предыдущих попыток и все еще содержит ранее записанные данные. Вы также должны передать биты режима для создания файла в качестве третьего аргумента open. Используйте это:

    // open the file for writing, truncate if it exists or create with
    // read/write permission for user, read permission for group and others
    fdw = open("gg.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    
  • комментарий // echo char to stdout, похоже, не относится ни к какому коду.

Вот исправленная версия:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    int fdr, fdw;   // file descriptors
    char c;

    fdr = open(argv[1],  O_RDONLY);   // open files
    if (fdr < 0) {
        fprintf(stderr, "failed to open input file %s: %s\n", argv[1], strerror(errno));
        return EXIT_FAILURE;
    }
    // open the output file for writing, truncate if it exists or create with
    // read/write permission for user, read permission for group and others
    fdw = open("gg.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fdw < 0) {
        fprintf(stderr, "failed to open output file %s: %s\n", "gg.txt", strerror(errno));
        return EXIT_FAILURE;
    }

    // read/write a single char from/to the files
    while (read(fdr, &c, 1) == 1) {
        if (c != ' ') {
            if (write(fdw, &c, 1) != 1) {
                perror("write() failed");
                return EXIT_FAILURE;
            }
        }
    }
    close(fdr);   // close the files
    close(fdw);
    return EXIT_SUCCESS;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...