fgets и EOF
От: Аноним  
Дата: 27.01.05 16:15
Оценка:
Имеется несложный код:
#include <stdio.h>
#include <fcntl.h>
#define MAXLINE 1024

char* readstrsk(char* line_out);

int main () {
const char *pathtofile = "/usr/local/script/c++_code/openfile/1.txt";
FILE *READFILE;
char* line,*outline;
char lit;
READFILE=fopen(pathtofile,"r");
if (READFILE == NULL) {
printf ("Error while openning file\n");
exit(1);
}

while (fgets(line,MAXLINE,READFILE) != NULL) {
int leng;

leng = strlen(line);
if (leng != 1) {
printf("%s",line);
}
}


printf("%s hahahahahaha\n");
fclose (READFILE);
return(0);
}

Вот только он вываливается в корочку с таким вот выводом:
root@server /usr/local/script/c++_code/openfile/#./a.out
server = freebsd2.owe
port= 3128
ip =192.168.10.114
user = skif
password=password
Ошибка сегментации (core dumped)
root@server /usr/local/script/c++_code/openfile/#

То бишь он считывает весь файл, а потом вываливается в корочку. Насколько я разобрал, проблема находиться в while (fgets(line,MAXLINE,READFILE) != NULL) — fhets по какой-то причине возвращает не NULL значение и соответственно программа ни как не реагирует на присутствие EOF, а следовательно валится в корку.
Почему такое происходит?
Или я не прав?
Re: fgets и EOF
От: Анатолий Широков СССР  
Дата: 27.01.05 16:23
Оценка:
А где выделяется память под line?
Re[2]: fgets и EOF
От: Анатолий Широков СССР  
Дата: 27.01.05 16:24
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>А где выделяется память под line?


А лучше на стек положи:

char line[MAXLINE];
Re[3]: fgets и EOF
От: Аноним  
Дата: 27.01.05 16:39
Оценка: :)
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Здравствуйте, Анатолий Широков, Вы писали:


АШ>>А где выделяется память под line?


АШ>А лучше на стек положи:


АШ>
АШ>char line[MAXLINE];
АШ>


такой вариант тоже пробовал. заканчивается аналогично.
По поводу первого, насколько я понимаю char* подразумевает под собой подобие динамческого массива.
Re: fgets и EOF
От: F1aSh  
Дата: 27.01.05 16:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Имеется несложный код:





А>Вот только он вываливается в корочку с таким вот выводом:

А>root@server /usr/local/script/c++_code/openfile/#./a.out
А> server = freebsd2.owe
А>port= 3128
А>ip =192.168.10.114
А> user = skif
А>password=password
А>Ошибка сегментации (core dumped)
А>root@server /usr/local/script/c++_code/openfile/#

А>То бишь он считывает весь файл, а потом вываливается в корочку. Насколько я разобрал, проблема находиться в while (fgets(line,MAXLINE,READFILE) != NULL) — fhets по какой-то причине возвращает не NULL значение и соответственно программа ни как не реагирует на присутствие EOF, а следовательно валится в корку.

А>Почему такое происходит?
А>Или я не прав?

У меня все работает:

// RSDN_TRY.cpp — readfile


#include "stdio.h"
#include "stdafx.h"
#include "fcntl.h"
#include "conio.h"
#define MAXLINE 1024

char* readstrsk(char* line_out);

int main () 
{
const char *pathtofile = "C:/1.txt";
FILE *READFILE;
char line[MAXLINE], *outline;
char lit;
READFILE = fopen(pathtofile, "r");
/////////////////////////////////////////////////////////
if (READFILE == NULL) 
{
    printf ("Error while openning file\n");
    exit(1);
}
/////////////////////////////////////////////////////////

while ( fgets(line,MAXLINE,READFILE) != NULL) 
{
    int leng;

    leng = strlen(line);
    if (leng != 1) 
    {
        printf("%s",line);
    }
}

printf("%s End of console readfile programm. A vot tut i hahahahaha ;-)\n");
fclose (READFILE);
getch();
return(0);
}
Re[2]: fgets и EOF
От: F1aSh  
Дата: 27.01.05 16:43
Оценка:
Скажу по секрету:

переменная lit типа чар и указатель типа чар на outline нигде не используются.
Re[4]: fgets и EOF
От: Анатолий Широков СССР  
Дата: 27.01.05 16:45
Оценка:
А>По поводу первого, насколько я понимаю char* подразумевает под собой подобие динамческого массива.

Нет, это все лишь указатель на участок памяти. В вашем случае указатель в никуда, в "пропасть".
Re: fgets и EOF
От: Centaur Россия  
Дата: 27.01.05 17:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>    printf("%s hahahahahaha\n");


А вот это что за идея? Спецификатор формата есть, а форматируется им что?
Re[2]: fgets и EOF
От: swarogich  
Дата: 28.01.05 08:54
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, Аноним, Вы писали:


C>
А>>    printf("%s hahahahahaha\n");
C>


C>А вот это что за идея? Спецификатор формата есть, а форматируется им что?


Глупо, но это именно оно...
Re[5]: fgets и EOF
От: swarogich  
Дата: 28.01.05 08:56
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

А>>По поводу первого, насколько я понимаю char* подразумевает под собой подобие динамческого массива.


АШ>Нет, это все лишь указатель на участок памяти. В вашем случае указатель в никуда, в "пропасть".


Поправьте, если я не прав — я новичок в Си, но указатель(pointer) имеет вид char *variable; , а не char* variable;
Re[3]: fgets и EOF
От: Skif Swarogich  
Дата: 28.01.05 09:00
Оценка:
Здравствуйте, F1aSh, Вы писали:

FS>Скажу по секрету:


FS>переменная lit типа чар и указатель типа чар на outline нигде не используются.

Нет, эти переменные нужны, просто я убрал весь муссор из программы, оставил только интересующие меня моменты. Но пару переменных все же забыл.
Re[6]: fgets и EOF
От: ilejn Россия  
Дата: 28.01.05 09:01
Оценка:
Здравствуйте, swarogich, Вы писали:


S>Поправьте, если я не прав — я новичок в Си, но указатель(pointer) имеет вид char *variable; , а не char* variable;


Если речь идет о пробеле, то он не важен.
Re[3]: fgets и EOF
От: Анатолий Широков СССР  
Дата: 28.01.05 09:04
Оценка:
C>>А вот это что за идея? Спецификатор формата есть, а форматируется им что?

S>Глупо, но это именно оно...


Серьезно, то есть с char *line программа нормально работала?
Re[2]: fgets и EOF
От: ilejn Россия  
Дата: 28.01.05 09:05
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, Аноним, Вы писали:


C>
А>>    printf("%s hahahahahaha\n");
C>


C>А вот это что за идея? Спецификатор формата есть, а форматируется им что?


Функция printf берет четыре байта из стека,
трактует их как указатель и выводит
данные, на которые он указывает, пока не встретится 0.

Обычно падает.
Re[7]: fgets и EOF
От: Skif Swarogich  
Дата: 28.01.05 09:20
Оценка:
Здравствуйте, ilejn, Вы писали:

I>Здравствуйте, swarogich, Вы писали:



S>>Поправьте, если я не прав — я новичок в Си, но указатель(pointer) имеет вид char *variable; , а не char* variable;


I>Если речь идет о пробеле, то он не важен.


Объясните, пожалуйста. получается записи вида
char* asdasd;
равносильны
char *asdasd;
Так получается? А почему тогда компилятор ругается на них по разному? точнее если я пытаюсь ппередать строку в первом случае ругани нет, а вовтором, говорит о некорректном преобразовании типов Integer или pointer
Re[4]: fgets и EOF
От: Skif Swarogich  
Дата: 28.01.05 09:21
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

C>>>А вот это что за идея? Спецификатор формата есть, а форматируется им что?


S>>Глупо, но это именно оно...


АШ>Серьезно, то есть с char *line программа нормально работала?


Ага.
Re[5]: fgets и EOF
От: Skif Swarogich  
Дата: 28.01.05 09:23
Оценка:
Здравствуйте, Skif Swarogich, Вы писали:

SS>Здравствуйте, Анатолий Широков, Вы писали:


C>>>>А вот это что за идея? Спецификатор формата есть, а форматируется им что?


S>>>Глупо, но это именно оно...


АШ>>Серьезно, то есть с char *line программа нормально работала?


SS>Ага.

Поправка char* line;
Re: fgets и EOF
От: Igore Россия  
Дата: 28.01.05 09:49
Оценка:
Здравствуйте, Аноним, Вы писали:


void A::ReadInfo(){
  FILE* fpin;
  char buf[255];

  fpin=fopen("EXPORT.TXT","rt");

  if (fpin==NULL)
  {
    printf("Не могу открыть файл: EXPORT.TXT\n");
    exit(1);
  }

  iTotal=0;
  while (!feof(fpin))
  {
    fgets(buf,255,fpin);
    if (feof(fpin)) break;
    iTotal++;
  }
  fclose(fpin);
  printf("iTotal=%ld\n",iTotal);
}


Попробуй вставить строчку которую я выделил.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.