Что мне нужно изменить в своем коде, чтобы получить правильный результат?

#c #output #reverse

Вопрос:

Как я могу получить результат, которого я хочу?

Мой код перевернет файл и каждую строку файла и напечатает номер перед строками.Но в моем коде это работает не очень хорошо. Пример:

 test.txt :
alma
barack
szilva
Result:
3 avlizs
2 kcarab
1 amla
 

Моя проблема в том, что я получаю такой результат:

Есть только число 3, но мне также нужны 1 и 2.

 3 avlizs
kcarab
amla
 

Что мне нужно изменить в своем коде, чтобы он работал хорошо?

 #ifndef REVERSE_H
#define REVERSE_H

void reverse( FILE *fp, char *name);

#endif /* REVERSE_H */ 
 
 #include <stdio.h>
#include "reverse.h"

int main( int argc, char *argv[])
{
  if ( argc < 2 )
  {
    reverse( stdin, "stdin"); /* stdin */     
  }
  else
  {
    int i;
    for ( i = 1; i < argc;   i )  /* fájlnevek */     
    {
      FILE *fp = fopen( argv[i], "r");
      if ( NULL != fp )
      {
         reverse( fp, argv[i]); /* fp-ről olvas */
         fclose(fp);
      }
      else
      {
        fprintf(stderr,"Can't open %s for readn",argv[i]);       
      }
    }
  }
  return 0;
}



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

#define INITCAP 4     
#define BUFSIZE 1024  

char **read( FILE *fp, int *pLines);
void   write( char **lines, int nLines, char *name);
void   revline( char *line);
void   memoria( void *ptr);

void reverse( FILE *fp, char *name)
{
  int nLines = 0;
  char **lines = read( fp, amp;nLines);    
  write( lines, nLines, name); 
}

     
char **read( FILE *fp, int *pLines)
{
  int  capacity = INITCAP;   
  int  nLines   = 0;         
  char buffer[BUFSIZE]; 
 
  char **lines = (char **)malloc(capacity * sizeof(char*));
  memoria(lines);
  while ( NULL != fgets(buffer, BUFSIZE, fp) ) 
  {
    int len = strlen(buffer);    
    if ( 'n' == buffer[len-1] )  
    {
      buffer[len-1] = '';     
    }
    if ( nLines == capacity )   
    {
      capacity *= 2;         
      lines = realloc( lines, capacity * sizeof(char *));
      memoria(lines);
    }
    lines[nLines] = (char *) malloc(len 1);    
    memoria(lines[nLines]);
    strcpy( lines[nLines], buffer);     
      nLines;
  }
  *pLines = nLines;  
  return lines;
}

void   write( char **lines, int nLines, char *name)
{
  
  for (int i = nLines-1; i >= 0; --i) 
  {
    char *curr = lines[i];
    fprintf( stdout, " %d " ,  i 1 );
    revline(curr); 
    free( curr);
  }
  free(lines);
}

void revline( char *line)
{
  int len = strlen(line);     
  while ( --len >= 0 )
  {
    fputc( line[len], stdout);      
  }
  fputc( 'n', stdout);
}

void memoria( void *ptr)
{
  if ( 0 == ptr )
  {
    fprintf( stderr, "Memory allocation failed!n");
    exit(1);    
  }   
}
 

Комментарии:

1. Я не могу подтвердить проблему, результат такой, как ожидалось. Может быть, перекомпилировать?

2. Я попытался, но в моем выводе в первой строке перед словом пишется число, но в следующих строках пишется только слово.

3. Также невозможно выполнить репликацию, даже если входной файл не заканчивается новой строкой.

Ответ №1:

Я предполагаю, что ваш текстовый файл был создан в Windows с rn окончаниями строк, а ваша программа работает в UNIX. Если это так, fopen(..., "r") вызов не преобразует эти окончания строк в n (это было бы сделано в Windows), и когда вы удаляете последнюю n строку, r она остается в конце. Отображение такой строки приведет к переходу на левое поле и перезаписи ранее записанного числа.

Я предлагаю этот стриптиз, просто чтобы быть уверенным

     while ( len amp;amp; ('n' == buffer[len-1] || 'r' == buffer[len-1]) )  
    {
      buffer[--len] = '';
    }
 

но это всего лишь предположение…