Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Чтение и вывод файла


Автор: N0rt0N 24.9.2008, 12:04
Задача в следующем, нужно написать функцию на C, которая бы считывала указанный текстовый файл и печатала его содержимое на экран. Как это можно сделать? Пытался так:
Код

void catFile(char *s0, char *s1, char *s2) 
{ FILE *cfPtr; 
char *rwfile; 
if(strcmp(s0, "") && !strcmp(s1, "") && !strcmp(s2, "")) { /*cat file.name*/ 
if((cfPtr = fopen(s0, "r")) == NULL) 
puts("File could not be opened"); 
else { while(!feof(cfPtr)) { fread(rwfile, sizeof(char), 1, cfPtr); } 
if(!strcmp(rwfile,"")) { puts(rwfile); } fclose(cfPtr); } }

но в ответ получал только Segmentation Fault Помогите пожалуйста разобраться!
Заранее спасибо!

Автор: vinter 24.9.2008, 12:09
память под rwfile, кто будет выделять?

Автор: N0rt0N 24.9.2008, 12:20
vinter
А как это лучше сделать? Как раз этого я и не мойму: char *rwfile = (char *) malloc (size);
А вот сколько должен быть size? Ведь изначально размер считываемого файла неизвестен...

Автор: Andrey44 24.9.2008, 12:27
Код

    
void catFile(char *s0, char *s1, char *s2) 

FILE *cfPtr; 
char *rwfile; 
if(strcmp(s0, "") && !strcmp(s1, "") && !strcmp(s2, ""))
{ /*cat file.name*/ 
     if((cfPtr = fopen(s0, "r")) == NULL) 
          puts("File could not be opened"); 
     else 
     {
           while(!feof(cfPtr))
           {
                fread(rwfile, sizeof(char), 1, cfPtr); 
           } 
     if(!strcmp(rwfile,"")) 
     { 
          puts(rwfile); 
     }
      fclose(cfPtr); 
}
}


Ну так-же намного приятнее читать?
N0rt0N,  как вы думаете?

Автор: N0rt0N 24.9.2008, 12:38
Andrey44
да, спасибо smile

Автор: vinter 24.9.2008, 12:54
Цитата

FILE *file;
fseek(END_OF_FILE);
size_t nFileSize = ftell(file); 
fseek(BEGIN_OF_FILE);

это псевдокод, я не помню параметры этих ф-ий найди их сам. Думаю идея ясна

Автор: knitmax87 24.9.2008, 13:35
Вот так вроде работает:
Код

#include <stdio.h>

int main()
{
    FILE * filePtr;
    char * rwfile;
    filePtr = fopen("test.txt", "rb");
    if (NULL != filePtr)
    {
        fseek(filePtr, SEEK_SET, SEEK_END);
        long fsize = ftell(filePtr);
        fseek(filePtr, SEEK_SET, 0);

        rwfile = new char[fsize+1];
        rwfile[fsize] = '\0';

        fread(rwfile, sizeof(char), fsize, filePtr);
        fclose(filePtr);

        printf("%s", rwfile);
    }
    else
    {
        printf("File couldn't be opend");
    }
    return 0;
}

Автор: Andrey44 24.9.2008, 14:14
knitmax87, позволю себе дополнить ваш код одной строчкой. smile 
Код

delete rwfile;

Автор: vinter 24.9.2008, 14:15
Andrey44
Цитата(Andrey44 @  24.9.2008,  15:14 Найти цитируемый пост)
delete []rwfile;


Автор: N0rt0N 24.9.2008, 14:20
Все получилось! Огромное спасибо за помощь!

Автор: Andrey44 24.9.2008, 14:53
vinter, совсем не обязательно нужны [] !

Автор: knitmax87 24.9.2008, 15:15
Цитата(Andrey44 @ 24.9.2008,  14:14)
knitmax87, позволю себе дополнить ваш код одной строчкой. smile 
Код

delete rwfile;

Согласен, забыл smile

Автор: vinter 24.9.2008, 16:03
Цитата(Andrey44 @  24.9.2008,  15:53 Найти цитируемый пост)
vinter, совсем не обязательно нужны [] !

обязательно. new\delete и new[]\delete[]/ Если new[]\delete, то это UB 

Автор: Andrey44 25.9.2008, 07:46
vinter, да точно, что-то я тормознул smile 

Автор: NebelDT 30.9.2008, 09:09
Этот пример даже с обработкой данных) smile 
Код

#include <stdio.h >
#include <string.h>
#include <stdlib.h>
main()
{
int P=0,L=0;
char NAZ[22],STR[4],FAM[10],CDD[2],TIR[7];
struct COMP{
char NAZ[22];char STR[4];char FAM[10];
char CDD[2]; char TIR[7];
};
COMP X;
FILE *one;
if((one=fopen("MUSIC.txt", "w+"))==NULL){
  puts("\n(((OSHIBKA)))\n");
  fflush(stdin);
  getchar();
  return (0);
}
puts("(((FAYL MUSIC.txt OPEN)))\n");
puts("(((VIBERITE PORAMETR POISKA[1,2,3,4 ILI 5])))\n");
scanf("%d",&P);
if(P==1){scanf("%22s",&NAZ);}
if(P==2){scanf("%4s",&STR); }
if(P==3){scanf("%10s",&FAM);}
if(P==4){scanf("%2s",&CDD); }
if(P==5){scanf("%7s",&TIR); }
while(!feof(one)){
     fscanf(one,"%22s",&X.NAZ);
     if(strcmp(X.NAZ,NAZ)==0){L++;}
     fscanf(one,"%4s",&X.STR);
     if(strcmp(X.STR,STR)==0){L++;}
     fscanf(one,"%10s",&X.FAM);
     if(strcmp(X.FAM,FAM)==0){L++;}
     fscanf(one,"%2s",&X.CDD);
     if(strcmp(X.CDD,CDD)==0){L++;}
     fscanf(one,"%7s",&X.TIR);
     if(strcmp(X.TIR,TIR)==0){L++;}
if(L==1){
printf("%22s%4s%10s%2s%7s\n",X.NAZ,X.STR,X.FAM,X.CDD,X.TIR);L=0;}
fprintf(one,"%22s%4s%10s%2s%7s\n",X.NAZ,X.STR,X.FAM,X.CDD,X.TIR);
}
fclose(one);
fflush(stdin);
getchar();
return(0);
}        

Автор: PELIKANN 1.10.2008, 16:51
ох спасибо!! эта тема очень мне помогла)

Автор: PELIKANN 1.10.2008, 17:50
вот только вопросик небольшой....по поводу этой проги...у меня тексовый файл очень большой....как сделать так чтобы он выводил с задержкой?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)