Я получаю сдвиг при попытке построить строку - PullRequest
1 голос
/ 09 марта 2012

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

/home/glennwiz/develop/c/SnuPort/ExpGetConfig.sh xogs1a 3/37
 > lastConfig.txt

я хочу 3/ 37 и> lastConfig должны находиться в одной строке.

это мой код.

char getConfig[100] = "/home/glennwiz/develop/c/SnuPort/ExpGetConfig.sh ";
char filedumpto[50] = " > lastConfig.txt";

FILE* file = fopen("rport.txt","r");
if(file == NULL)
{
    return NULL;
}

fseek(file, 0, SEEK_END);
long int size = ftell(file);
rewind(file);
char* port = calloc(size, 1);
fread(port,1,size,file);

strcat(getConfig, argv[1]);
strcat(getConfig, port);
strcat(getConfig, filedumpto);

printf(getConfig);

//system(getConfig);

return 0;

edit

я выгрузил вывод в файл и открыл его вVIM, чтобы увидеть, и он отправляет ^ M после переменной, которая является введите я верю?почему он это делает? Я попробовал решения в этом посте, но он не работает.

tester port print!!!!
/home/glennwiz/develop/c/SnuPort/ExpGetConfig.sh randa1ar2 5/48^M
> SisteConfig.txt
tester port print!!!!

Ответы [ 2 ]

4 голосов
/ 09 марта 2012

Входной файл ("rport.txt"), вероятно, содержит новую строку.Удалите пробелы из конца прочитанного ввода, и все должно быть в порядке.

1 голос
/ 09 марта 2012

Файл, вероятно, заканчивается последовательностью конца строки.

Неряшливый, хрупкий раствор:

fread(port, 1,size-1, file); // If it's just a CR or LF
fread(port, 1,size-2, file); // If it's a combination of CRLF.
// your code continues here

Лучшее, портативное решение будет делать что-то вроде этого:

char *port = calloc(size+1, sizeof(char));  // Ensure string will end with null
int len = fread(port, 1, size, file);       // Read len characters
char *end = port + len - 1;                 // Last char from the file

// If the last char is a CR or LF, shorten the string.
while (end >= p) && ((*end == '\r') || (*end == '\n')) {
  *(end--) = '\0';
}

Вот рабочий код:

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

char getConfig[100] = "/home/glennwiz/develop/c/SnuPort/ExpGetConfig.sh ";
const char *filedumpto = " > lastConfig.txt";

int main(char argc, char *argv[]) {
  FILE *file = fopen("rport.txt", "r");
  if (file == NULL) {
    return 1;
  }

  fseek(file, 0, SEEK_END);
  long int size = ftell(file);
  rewind(file);

  char *port = calloc(size+1, 1);
  int len = fread(port, 1, size, file);       // Read len characters
  char *end = port + len - 1;                 // Last char from the file

  // While the last char is a CR or LF, shorten the string.
  while ((end >= port) && ((*end == '\r') || (*end == '\n'))) {
    *(end--) = '\0';
  }

  strcat(getConfig, argv[1]);
  strcat(getConfig, port);
  strcat(getConfig, filedumpto);

  printf("%s\n", getConfig);
  return 0;
}
...