2015-05-14 5 views
1

Я пытаюсь написать небольшую программу, чтобы отменить первые n символов текста в файле. Я написал ::Обращение n символов файла

void getdata(FILE *fp) 
{ 
    char ch; 
    printf("Enter text::\n"); 
    while((ch=getchar())!=EOF) 
     fputc(ch,fp); 
} 

void printdata(FILE *fp) 
{ 
    char ch; 
    while((ch=fgetc(fp))!=EOF) 
     putchar(ch); 
} 

void reverse(FILE *fp, int n) 
{ 
    char ch[20]; 
    for(int i=0;i<n;++i) 
     ch[i]=fgetc(fp); 
    rewind(fp); 
    printf("%.*s\n",n,ch); //printing the string 
    while(n--) 
     fputc(ch[n-1],fp); 
} 

int main() 
{ 
    FILE *fp; 
    int n; 
    fp=fopen("music.txt","w+"); 
    getdata(fp); 
    rewind(fp); 
    printf("Number of chars to reverse:: "); 
    scanf("%d",&n); 
    reverse(fp,n); 
    rewind(fp); 
    printf("After reversing text is::\n"); 
    printdata(fp); 
    fclose(fp); 
    return 0; 
} 

И выход enter image description here

Где я буду неправильно? Почему существует «u»? EDIT: Я мог заставить его работать, заменив время цикла с

for(int i=0;i<n;++i) 
     fputc(ch[n-1-i],fp); 

Но что вина в то время?

+1

@ Javia1492 heh? скорее вам следует советоваться, так как 'EOF' может не вписываться в' char', измените тип 'ch' на' int'. –

+0

@Lokesh Jaddu И, если вы не заметили, переполнение потенциального буфера в функции 'reverse()'. – Downvoter

+0

@ Javia1492 1) В какой строке вы нашли 'eof()'? Пожалуйста, укажите это для меня. 2) Каков тип возврата 'getchar()'? и я не _implying_ ничего. Я вам говорю, это плохо. Надеюсь, вы не против. :-) –

ответ

1

Ошибка в вашем времени, это то, что первый шаг цикла n. В вашем случае использования n начинаются с 4 вместо 5. Затем вы назначаете символ на n-1, это означает, что n должен начинаться с 5. В конце вашей петли 4 время, а не 5.

Изменить

while(n--) 
     fputc(ch[n-1],fp); 

в

do 
{ 
    fputc(ch[n-1],fp); 
}while(--n); 

Еще одна маленькая вещь. Ваша обратная функция не проверяет, что n не может быть> длины ch, в вашем случае 20.

+0

Хороший улов. Конструкция 'while (n--) ...' по-прежнему является хорошей идиомой для итерации назад, но ей нужно получить доступ к ch [n] 'вместо' ch [n-1] '. Таким образом, прямое решение без неясного индексирования будет «while (n--) fputc (ch [n], fp);». –

+0

Да, конечно. Ваше решение быстрее. Мое решение должно было быть, я надеюсь, более ясным для ОП. – LPs

+0

Ваш ответ хороший. Это был скорее дополнительный комментарий. (Возможно, просто для себя, потому что я просмотрел код и не смог увидеть ошибку. Это проблема с idoims: они могут заставить вас игнорировать очевидное.) –

0
for(int i=0;i<n;++i) //consider n as 5 
    fputc(ch[n-1-i],fp);// ch[5-1-0] ch[5-1-1] ch[5-1-2] ... 

не эквивалентно

while(n--)    //consider n as 5 
    fputc(ch[n-1],fp); //ch[4-1] ch[3-1] .... 

в то время как после того, как петли while(n--), когда управление достигает fputc(ch[n-1],fp) п уже уменьшается.

Смежные вопросы