Автор Тема: Малко помощ при курсова...  (Прочетена 2146 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

kolimnared

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 1
Малко помощ при курсова...
« -: 22 Декември 2013, 15:10:48 »
Така-а-а имам курсова по C...да се прочете файл, да се намери еди какво си...както и да. Имам проблем с реализацията на 3-та точка: Ако срещне коментар да сменя малките букви с големи и обратното...

Код: C++
  1. int commentsChange(void){
  2.         char str[256], fileName[256];
  3.         FILE *fp;
  4.         int i, j, k, l=0;
  5.  
  6.         do{
  7.                 fflush(stdin);
  8.                 printf("%s\nEnter the name of the file in %s/", p, dir);
  9.                 gets(fileName);
  10.  
  11.                 if(!(fp=fopen(fileName, "rb+"))){
  12.                         printf("File NOT Found!\n");
  13.                         return 0;
  14.                 }
  15.  
  16.                 j=0;
  17.  
  18.                 while(!feof(fp)){
  19.                         fgets(str, 255, fp);
  20.                         for(i=0;i<strlen(str);i++){
  21.                                 if(str[i]=='/' && str[i+1]=='*') j=1;
  22.                                 else if(str[i]=='*' && str[i+1]=='/') j=0;
  23.  
  24.                                 if(j && str[i]>64 && str[i]<91) str[i]=tolower(str[i]);
  25.                                 else if(j && str[i]>96 && str[i]<123) str[i]=toupper(str[i]);
  26.  
  27.                                 if(str[i]=='/' && str[i+1]=='/'){
  28.                                         for(k=i;k<strlen(str);k++){
  29.                                                 if(str[k]>64 && str[k]<91) str[k]=tolower(str[k]);
  30.                                                 else if(str[k]>96 && str[k]<123) str[k]=toupper(str[k]);
  31.                                         }
  32.                                 }
  33.                         }
  34.                         fseek(fp, l*sizeof(char),SEEK_SET);
  35.                         fprintf(fp, "%s", str);
  36.                         l+=strlen(str);
  37.                 }
  38.                
  39.  
  40.                 printf("\n\"%s\" saved successfully.\n", fileName);
  41.                 puts(p);
  42.  
  43.                 printf("Do you want to search for another file<Y/N>: ");
  44.                 i=ch_Checker();
  45.                
  46.         }while(i);
  47.         return 0;
  48. }
  49.  

ето така съм го написал, и проблема е, че като въведа файла и блокира програмата и постоянно записва празни редове... прилагам снимка на текста преди и след обработката, явно проблема е в fseek(), но не мога да разбера къде... ако дам само принтф() без да го записвам си изкарва на екрана всичко правилно.
успях да я направя с двумерен масив където записвам целият текст и после с "r+" си записвам информацията върху тази, успях да го направя и с 2-ри *.тмп файл,
но искам да го направя по този начин точно... някой може ли да ми каже къде бъркам...
« Последна редакция: 23 Декември 2013, 13:05:04 от metost »

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: Малко помощ при курсова...
« Отговор #1 -: 23 Декември 2013, 13:58:35 »
Логиката ти не ми изглежда много правилна. А и условието на задачата не  ми е много ясно.
Искаш като срещнеш коментар всички букви в този коментар да се обърнат от мали в големи и от големи в малки ли, или всичко останало до края на файла да се обърне?
Името на масив е поинтер към първия елемент от масива. Т.е
str -> сочи към първия елемент от стринга
Ако му добавиш едно str++, то тогава str сочи към следващия елемент.
 Така че логиката ти не е правилна.
Код: C
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.     int i, j = 0;
  6.     char str[256] = "Hello /*comment with SoMe big and somE SMALL letters*/ end of the sentence.";
  7.  
  8.     printf("Before:\n%s", str);
  9.     for(i = 0; i < (unsigned int) strlen(str); i++)
  10.     {
  11.         // намираш началото на коментар
  12.         if(str[i] == '/' && str[i + 1] == '*')
  13.         {
  14.             // i = /, i + 1 = * за това слагаш j = i + 2
  15.             // и буква по буква докато не срещнеш край на коментара ги обръщаш
  16.             for(j = i + 2; !(str[j] == '*' && str[j + 1] == '/'); j++ )
  17.             {
  18.                 if(str[j] > 64 && str[j] < 91)
  19.                 {
  20.                     str[j] = str[j] + 32;
  21.                 }
  22.                 else if(str[j] > 96 && str[j] < 123)
  23.                 {
  24.                    str[j] = str[j] - 32;
  25.                 }
  26.             }
  27.            // накрая слагаш i = елемента след каря на коментара и продългаваш да обхождаш от там
  28.             i = j + 2;
  29.         }
  30.     }
  31.     printf("\n\nAfter:\n%s", str);
  32.  
  33.     return 0;
  34. }
  35.  
« Последна редакция: 23 Декември 2013, 14:08:28 от kjufte »