#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] = '';
}
но это всего лишь предположение…