Есть ли способ взять текст из файла и превратить его в аргумент для моей c программы? - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть проект C, в котором пользователь может ввести 8-разрядное двоичное число или открыть текстовый файл с 8-разрядным двоичным числом. У меня проблемы с получением 8-битного двоичного числа из файла и передачей этого аргумента char * argv [] для моей программы. Вот как я читаю 8-битное двоичное число из файла

    fd = open(argv[1], O_RDONLY);
    read(fd,jString, 100);
    close(fd);
    printf("jString: %s\n", jString);

Прямо сейчас я знаю только, как поместить 8-битное двоичное число в строку, но я хочу повернуть каждый 8-битный Ввод двоичного числа, разделенный пробелами из файла в аргумент char * argv [] для моей программы, возможно ли это, если да, как мне это сделать?

Что-то, что я уже пробовал, это.

    fd = open(argv[1], O_RDONLY);
    read(fd,argv[1], 100);

проблема в том, что он просто читает весь файл в argv [1] и не разделяет их пробелами и другими аргументами для моей программы.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

здесь ваша программа с динамическим c выделение памяти:

  • Аргумент separtor = ' '
  • Аргумент от commande = your_program_name "10001010" "01010101"
  • Аргумент из file: command-line = your_program_name "...\yourfile.xyz" Пример:

enter image description here

#include <malloc.h>
#include <string.h>
#include <stdio.h>

#define DELIMITER ' '

// Tokenize function
int Tokenize(char* pcLine, char ** pcListeArgs, const char* pcDelim)
{
    int iNumElet = 0;
    size_t len = 0;         

    // Get line size
    int init_size = strlen(pcLine);

    char *ptr = strtok(pcLine, pcDelim);

    while(ptr != NULL)
    {
        len = strlen(ptr);
        pcListeArgs [iNumElet] = (char*) calloc (len+1, sizeof (char));
        memset(pcListeArgs [iNumElet], 0, len+1); // reset content
        memcpy (pcListeArgs [iNumElet], ptr, len); // copy data

        ptr = strtok(NULL, pcDelim);

        iNumElet ++;
    }

    return iNumElet;
}

int main(int argc, char** argv)
{
    FILE * fp;
    char * line = NULL;
    size_t len = 0;
    char ch;
    char *pcFileContent;
    char cDelim = DELIMITER;



    // Case : argument are a file 
    if (argc == 2) 
    {
        const char* pcFilePath = argv[1];
        fp = fopen(pcFilePath, "r");

        if (fp == NULL)
        {
            perror("Error while opening the file.\n");
            return (-1);
        }

        // Put the curso at the end of file
        fseek (fp,0, SEEK_END);

        // Get number of charactes
        len = ftell(fp);

        // Allocat memory 
        pcFileContent = (char*) calloc (len+1, sizeof (char));

        //Erase content to zero
        memset(pcFileContent,'\0',len+1);

        // Put the curso at the begining of file
        fseek (fp,0, SEEK_SET);

        // Read file char by char
        unsigned int i=0;
        unsigned int iNbArgs = 1;

        while((ch = fgetc(fp)) != EOF)
        {
            if (ch == DELIMITER)
                iNbArgs ++; // We have a new arguments              

            pcFileContent[i++] = ch;
        }

        char **pcListeArgs =  (char**) calloc (iNbArgs, sizeof (char*));

        iNbArgs = Tokenize (pcFileContent, pcListeArgs, &cDelim);

        // here you have all you arguments ....
        for ( i=0; i< iNbArgs; i++)
        {
            printf ("Argument %d = %s\n", i, pcListeArgs[i]);
        }

        // Free memory
        for(int i = 0; i < iNbArgs; i++)
            free(pcListeArgs[i]);

        free(pcListeArgs);
        free(pcFileContent);

    }else if ( argc > 2) // Case : argument is binary number
    {
        for ( int i=1; i< argc; i++)
        {
            printf ("Argument %d = %s\n", i, argv[i]);
        }
    }

    return 0;
}

Результат:

  • Аргумент от комманд = = 1025 *

enter image description here

  • Аргумент из файла: командная строка = ArgParsor.exe "G:\temp.txt"

enter image description here

0 голосов
/ 18 февраля 2020

У меня возникли проблемы с получением 8-битного двоичного числа из файла и присвоением ему аргумента char * argv [] для моей программы

Вы не можете этого сделать , Обычное объявление

int main(int argc, char** argv){};

означает, что эти 2 аргумента предоставляются вам операционной системой при запуске вашей программы. То, что вы можете сделать, это создать что-то подобное для вашей программы, скажем, int myArgCount и char** myArgValues;, но, похоже, вам это не нужно.

Если task ваша программа, выполняется task 00001111 положит 00001111 в argv[1]. И установите argc на 2, поскольку argv[0] всегда является полным путем к вашей программе.

Сначала вы говорите, что двоичное число может быть предоставлено в файле, но в следующем параграфе вы сказали

я хочу повернуть каждый 8-битный двоичный номер, разделенный пробелами

Если на самом деле входной файл может иметь список 8-битных двоичных чисел, разделенных пробелы - а не только один - вам нужно будет создать список точно так же, как система делает для вас, выделив память для чисел и создав массив указателей на них, и int с количеством чисел. Это не сложно.

Приведенный ниже код проверяет аргумент в командной строке и, если его нет, пытается открыть файл source.txt, чтобы получить его. Может быть, это поможет.

Обратите внимание на использование scanf() для чтения значений из файла. Используемая маска "%8[01]" очень удобна: она принимает только 0 и 1 для максимум 8 цифр.

#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main(int argc, char** argv)
{
    char        binary_number[10];
    char*       mask = "%8[01]"; // for scanf()
    const char* FileName = "source.txt";

    if (argc < 2)
    {   // no number on the command line
        fprintf(stderr, "\nNo 8-bit number provided on the command line\n");
        FILE* in_file = fopen(FileName, "r");
        if (in_file == NULL)
        {
            fprintf(stderr, "Could not open [%s]\n", FileName);
            return -1;
        }
        int n = fscanf(in_file, mask, binary_number);
        printf("\nFrom the file [%s] number is [%s]\n", FileName, binary_number);
        fclose(in_file);
    }
    else
    {   // number provided
        strncpy(binary_number, argv[1], 9);
        fprintf(stderr, "\nFrom the command line: [%s]\n", argv[1]);
    };
    return(EXIT_SUCCESS);
};

программа показывает

From the command line: [101010]

или

    No 8-bit number provided on the command line
    From the file [source.txt] number is [11110000]
...