Запись в файл с использованием write () добавляет nuls повсеместно, как их удалить? - PullRequest
0 голосов
/ 20 апреля 2020

У меня проблемы с использованием write (). Я записываю 2d массив в файл .txt, но когда он записывается в файл, в него добавляется набор символов NUL (не NULL). поэтому я отправился на поиски и нашел это, чтобы удалить символов , но это не помогло, я попытался удалить \ 0, 00, не зная, как поступить с nuls. пробуя некоторые вещи, которые я пытался сделать, sizeof(table[0][0]) дал бы мне 4, тогда я сделал strncpy(buffer, table[0][0], 2), но, думаю, это не сработало и не помогло.

Это часть моей программы, я может выложить остальное при необходимости.

обновление: добавлена ​​вся программа внизу

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

int main()
{
    char *table[8][8] = {{NULL}};
    int fdi;
    char *buffer; 
    char msg[1] = "\n";
    char msg1[1] = ",";

    fdi = open("board.txt", O_RDWR);
    if (fdi != -1)
    {
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 8; j++)
            {
                buffer = table[i][j];
                //strcpy(buffer,table[i][j]);
                write(fdi, buffer, sizeof(buffer));
                write(fdi, msg1, sizeof(msg1));
            }
            write(fdi, msg, sizeof(msg));
        }
        close(fdi);
    }
}

Это вывод, который я получаю I get

Это то, что я хочу получить to get

Спасибо за любой вклад.

#include <stdio.h>
#include <stdlib.h> // For exit() function
#include <string.h>
#include <ctype.h>
#include <fcntl.h>
#include <unistd.h>//throwing a warning write() seems to work fine without it
#define MAXC 1024
int getColRow(char *input)
{
   int val = 0;
   for (int i = 0; input[i]; i++)
   {
       input[i] = tolower(input[i]);
   }
   switch (input[0])
   {
   //row
   case 97:
       val = 0;
       break;
   case 98:
       val = 1;
       break;
   case 99:
       val = 2;
       break;
   case 100:
       val = 3;
       break;
   case 101:
       val = 4;
       break;
   case 102:
       val = 5;
       break;
   case 103:
       val = 6;
       break;
   case 104:
       val = 7;
       break;
   //col
   case 49:
       val = 7;
       break;
   case 50:
       val = 6;
       break;
   case 51:
       val = 5;
       break;
   case 52:
       val = 4;
       break;
   case 53:
       val = 3;
       break;
   case 54:
       val = 2;
       break;
   case 55:
       val = 1;
       break;
   case 56:
       val = 0;
       break;
   default:
       break;
   }
   return val;
}

int main()
{
   char c[1000];
   char ch[1000];
   FILE *fp, *fd, *op;
   char word[1000], *token;
   char *table[8][8] = {{NULL}};
   int i = 0;
   int j = 0;
   char input[50];
   char *endPos;
   char *buffer;
   char *exit = "exit";
   char *show = "show";
   char *move = "mv";
   char *cp = "cp";
   char *prq = "prq";
   char *prr = "prq";
   char *prb = "prb";
   char *prk = "prk";
   int a0Row, b0Col, a1Row, b1Col;
   int fdi;

int len = 10;

if ((fp = fopen("board.txt", "r")) == NULL)
{
    printf("Error! opening file");
    return 0;
}

// if ((fd = fopen("board.txt", "r")) == NULL)
// {
//     printf("Error! opening file");
//     return 0;
// }

//print csv file(formated) one first time to see starting board
// while (fgets(ch, MAXC, fd))
// {
//     for (char *tok = strtok(ch, ","); tok; tok = strtok(NULL, ","))
//     {
//         size_t len;
//         tok[strcspn(tok, "\n")] = 0; /* trim '\n' from end tok */
//         printf("%s ", tok);
//     }
//     printf("\n");
// }

//fill array
while (fscanf(fp, "%3s", c) != EOF)
{
    token = strtok(c, ",");
    len = strlen(token);
    //printf("%s ", token);
    table[i][j] = malloc(len + 1);

    memcpy(table[i][j++], token, len + 1);
    if (j >= 8)
    {
        i++;
        j = 0;
        //printf("\n");
    }
}

do
{
    int counter1 = 8;
    int counter2 = 8;
    fd = fopen("board.txt", "r");
    printf("\n\t\t\tCHESS BOARD\n\n");
    printf("      a      b      c      d      e      f      g      h");
    printf("\n     |-------------------------------------------------------|\n");
    while (fgets(ch, MAXC, fd))
    {

        i = 0;
        j = 0;
        for (char *tok = strtok(ch, ","); tok; tok = strtok(NULL, ","))
        {
            if (i == 0)
            {
                printf("%d |", counter1);
                i++;
                counter1--;
            }

            if (j >= 8)
            {
                i == 0;
            }
            size_t len;
            tok[strcspn(tok, "\n")] = 0; /* trim '\n' from end tok */
            printf("  %s  |", tok);
            j++;
            if (j == 8)
            {
                printf(" %d", counter2);
                counter2--;
                j == 0;
            }
        }
        printf("\n  |-------------------------------------------------------|\n");
    }
    printf("      a      b      c      d      e      f      g      h");
    fclose(fd);

    printf("\n\n\nwhats your move (mv, cp, prQ, prR, prB, prK, show, exit): ");
    scanf("%s", &input);
    for (int i = 0; input[i]; i++)
    {
        input[i] = tolower(input[i]);
    }

    if (strcmp(input, show) == 0)
    {
        fp = fopen("board.txt", "r");
        if (fp == NULL)
        {
            printf("Could not open file");
            return 1;
        }
        printf("\ncontents of board.csv\n\n");
        while (fgets(input, 10, fp) != NULL)
            printf("%s", input);
        fclose(fp);
        printf("\n\n");
    }

    else if (strcmp(input, move) == 0)
    {
        printf("What Piece are you wanting to move\nEnter row(1-8): ");
        scanf("%s", &input);
        a0Row = getColRow(input);
        printf("Enter column(a-h): ");
        scanf("%s", &input);
        b0Col = getColRow(input);

        printf("\nWhere do you want to move it to\nEnter row(1-8): ");
        scanf("%s", &input);
        a1Row = getColRow(input);
        printf("Enter column(a-h): ");
        scanf("%s", &input);
        b1Col = getColRow(input);

        endPos = table[a1Row][b1Col];
        table[a1Row][b1Col] = table[a0Row][b0Col];
        table[a0Row][b0Col] = endPos;

        printf("\n\n\n");
        for (i = 0; i < 8; i++)
        {
            //printf("\n");
            for (j = 0; j < 8; j++)
            {
                printf("%s ", table[i][j]);
            }
            printf("\n");
        }



//
//this is where the problem starts
//
//

        fdi = open("board.txt", O_RDWR);
        char msg[1] = "\n";
        char msg1[1] = ",";

        for(i =0; i<8;i++)
        {
            for(j=0; j<8;j++)
            {
                printf("size %d ", sizeof(table[i][j]));
            }
            printf("\n");
        }
        buffer = malloc(*table[0][0]);
        if (fdi != -1)
        {
            for (i = 0; i < 8; i++)
            {
                for (j = 0; j < 8; j++)
                {   
                    buffer = table[i][j];
                    //removeChar(buffer, (int)NULL);
                    //strcpy(buffer,table[i][j]);
                    write(fdi, buffer, sizeof(buffer));
                    write(fdi, msg1, sizeof(msg1));
                }
                write(fdi, msg, sizeof(msg));
            }
            close(fdi);
        }
    }
//
// Issue Ends here
//
//

} while (strcmp(input, exit) != 0);

printf("\n\n\n");//testing printing
for (i = 0; i < 8; i++)
{
    //printf("\n");
    for (j = 0; j < 8; j++)
    {
        //printf("table[%d][%d] = %s|", i, j, table[i][j]);
        printf("%s ", table[i][j]);
    }
    printf("\n");
}

fclose(fp);

return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...