2014-09-07 3 views
-2

Вот моя проблема. Выходной файл состоит из семи строк, например:Чтение количества строк в выходном файле

Dinda 
Jane 
is 
so 
beautiful 
and 
handsome. 

Нам предлагается прочитать, сколько строк имеет выходной файл. Но две строки должны учитывать только 1. Таким образом, точное число строк в этой программе должно быть четыре (включая последнюю одну строку). Как я должен читать две строки за раз? Это то, что я получил до сих пор.

#include<stdio.h> 
main() 
{ 
    FILE *fp; 
    char filename[25]; 
    char c[25][25]; 
    int a; 

    clrscr(); 

    printf("Enter File Name: "); 
    gets(filename); 

    if(filename==NULL) 
    { 
     printf("\nERROR! File Doesn't Exist!"); 
    } 
    else 
    { 
     fp=fopen(filename,"r"); 

     while(!feof(fp)) 
     { 
      fgets(&c,sizeof(c),fp); 
      printf("%s",c); 
      if(strlen(c)) 
      { 
       a++; 
      } 
     } 

     printf("The Number of Words are: %d",a); 
     fclose(fp); 
     getch(); 
    } 
} 
+5

Не используйте 'gets'. И тест 'if (filename == NULL)' никогда не будет правдой. Массивы не являются указателями. –

+5

Подсчитайте количество строк, используя fgets, а затем распечатайте (n + 1)/2 в результате. –

+3

['while (! Feof (fp))'] (https://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong/5432517#5432517) - это то, что вы хотите исправить правильно Теперь. Это неправильно, и вам не помогает ваше предположение 'fgets' * work * без проверки проверки вообще. – WhozCraig

ответ

0

попробовать что-то вроде этого:

char c = getc(fp); 
while (c != EOF) { 
    if (c == '\n') a++: 
    c = getc(fp); 
} 

printf("Number of line is %d", (a + 1)/2); // (the +1 is for the last line) 
+1

Примечание: следует использовать 'int c'. В противном случае 1 из 256 различных 'char' будет соответствовать' EOF'. – chux

1
fp = fopen(filename,"r"); 
int flag = 0 
ch = getc(fp) 
while(ch != EOF) 
{ 
    if(ch == '\n') 
    { 
     flag++; 
    } 
    ch = getc(fp); 
} 
flag = (flag+1)/2; 

попробовать этот код в еще части вашего кода ..

Он получает один символ за один раз, и сравнивает, если это символ новой строки. он увеличивает значение переменной флага, если это новый символ строки. в конце после того, как все символы в файле пройдены. это сделает значение флага наполовину. так же, как и хотите это ..

1

Почему сделать это трудно (читай 2 линии), когда вы делаете это просто так:

#include<stdio.h> 
#include<string.h> 
main() 
{ 
    FILE *fp; 
    char filename[25]; 
    char buffer[256]; 
    int buffer_size = sizeof(buffer); 
    int a=0; 

    printf("Enter File Name: "); 
    fgets(filename,sizeof(filename),stdin); //Always use fgets 
    filename[strlen(filename)-1]='\0'; //Remove \n from the filename 

    fp=fopen(filename,"r"); 
    if(fp==NULL) //Check if file pointer is NULL then return 
    { 
     printf("\nERROR! File Doesn't Exist!"); 
     return; 
    } 

    while (fgets(buffer, buffer_size, fp)) //Count number of lines in file 
    { 
     a++; 
    } 

    fclose(fp); 

    //If number of lines are even then just divide by 2 else divide by 2 and add one 
    if (a % 2 == 0) 
     a = (a/2); 
    else   
     a = (a/2) + 1; 

    printf("The Number of lines are: %d",a); 
    return 0; 
} 
+2

Незначительный: вместо блока 'if (% 2 == 0)', просто 'a = a/2 + a% 2;'. – chux

+0

@chux: ваше предложение намного лучше :) Спасибо +1 – user1336087

+1

Ваша идея 'a% 2', хотя и немного лучше, чем' a = (a + 1)/2', как другие отправили для сингулярного случая, когда 'a == INT_MAX', ваш подход подходит к правильному ответу. IMO, 'int' слишком мал для подсчета строк, поскольку файлы могут быть огромными. – chux

1

Есть много возможных решений. Принимая «прочитала две строки в то время,» буквально, вы получите

char c[256]; 
while(fgets (c, sizeof(c), fp))) 
{ 
    a++; 
    if (!fgets(c,sizeof(c),fp)) 
     break; 
} 

, который считывает одну строки, увеличивает счетчик строки, а затем считывает другую строку без приращения счетчика. Он будет работать корректно, даже если последняя строка не заканчивается возвратом (отсутствует в вашем spec, но при наблюдении WhozCraig).

Он может иметь дело с одиночными линиями длиной до 254 символов (исключая завершающий \n). Вы можете отрегулировать код, чтобы разрешить более длинные строки, чем это: поместите обе команды fgets внутри цикла и вырваться из него, если последний прочитанный символ равен \n (или fgets возвращает 0, чтобы указать конец файла или ошибку).

+0

Я начал копировать детали из OP: P Странное объявление 'char c [25] [25];' отбросило меня, я пропустил вторую часть при фиксации. – usr2564301

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