2013-04-05 4 views
0

Я читаю текстовый файл и пытаюсь отобразить его содержимое на консоли. Вот мой код:Чтение текстового файла в C

#include "stdafx.h" 
#include <stdio.h> 
#include <string.h> 
#include <fstream> 

int main() 
{ 
    FILE* fp=NULL; 
    char buff[100]; 
    fp=fopen("myfile.txt","r"); 
    if(fp==NULL) 
    { 
     printf("Couldn't Open the File!!!\n"); 
    } 
    fseek(fp, 0, SEEK_END); 
    size_t file_size = ftell(fp); 
    fread(buff,file_size,1,fp); 
    printf("Data Read [%s]",buff); 
    fclose(fp); 
    return 0; 
} 

но только избыточные данные отображаются на консоли; может кто-нибудь, пожалуйста, укажет на мою ошибку?

+5

Awww что форматирование ... – 2013-04-05 06:27:03

+0

попробуйте вещь ... сделайте это .. char * buff ... и затем printf («Data Read% s», buff); .. дайте мне знать, если это сработает ... Я решил проблему с этим, не совсем, но немного больше ... –

+0

http://stackoverflow.com/questions/410943/reading-a-text-file-into-an-array-in-c –

ответ

3

Вы должны искать обратно в начало файла перед чтением:

int main() 
{ 
    FILE* fp=NULL; 
    char buff[100]; 
    fp=fopen("myfile.txt","r"); 
    if(fp==NULL) 
    { 
     printf("Couldn't Open the File!!!\n"); 
     exit(1);      // <<< handle fopen failure 
    } 
    fseek(fp, 0, SEEK_END); 
    size_t file_size = ftell(fp); 
    fseek(fp, 0, SEEK_SET);   // <<< seek to start of file 
    fread(buff,file_size,1,fp); 
    printf("Data Read [%s]",buff); 
    fclose(fp); 
    return 0; 
} 
+0

Большое спасибо:) @ Paul R –

4

Вы забыли сбросить указатель на файл, чтобы начать после того, как это делать.

fseek(fp, 0, SEEK_END); 

Сделайте это после определения размера (file_size).

rewind (fp); 
+0

Или: 'fseek (fp, 0L, SEEK_SET);' –

+0

@JonathanLeffler Да. Это тоже сработает. Возможно, перемотка (fp) вызывает fseek для выполнения работы. – dejavu

+1

Большое спасибо Android Decoded и Jonathan Leffler :) :) –

0

Попробуй ....

#include <stdio.h> 
#include <stdlib.h> 

void handle_line(char *line) { 
printf("%s", line); 
} 

int main(int argc, char *argv[]) { 
int size = 1024, pos; 
int c; 
char *buffer = (char *)malloc(size); 

FILE *f = fopen("myfile.txt", "r"); 
if(f) { 
    do { // read all lines in file 
    pos = 0; 
    do{ // read one line 
     c = fgetc(f); 
     if(c != EOF) buffer[pos++] = (char)c; 
     if(pos >= size - 1) { // increase buffer length - leave room for 0 
     size *=2; 
     buffer = (char*)realloc(buffer, size); 
     } 
    }while(c != EOF && c != '\n'); 
    buffer[pos] = 0; 
    // line is now in buffer 
    handle_line(buffer); 
    } while(c != EOF); 
    fclose(f);   
} 
free(buffer); 
return 0; 

}

+0

Это много кода. Вы проверяете результат 'fopen()' и не используете его, если open failed - это хорошо. Теоретически, вы должны проверить 'malloc()'. Вы не должны использовать 'buffer = realloc (buffer, size);' потому что, если 'realloc()' fail, вы потеряли единственный указатель на выделенную память, и поэтому вы просочились все, что было выделено раньше. Я думаю, что я буду использовать 'fgets()' или POSIX 'getline()' вместо ввода символов по символу. –

0
#include "stdafx.h" 
    #include <stdio.h> 
    #include <string.h> 
    #include <fstream> 

    int main() 
    { 
     FILE* fp=NULL; 
     char *buff;      //change array to pointer 
     fp=fopen("myfile.txt","r"); 
     if(fp==NULL) 
     { 
      printf("Couldn't Open the File!!!\n"); 
     } 
     fseek(fp, 0, SEEK_END); 
     size_t file_size = ftell(fp); 
     buff = malloc(file_size);  //allocating memory needed for reading file data 
     fseek(fp,0,SEEK_SET);   //changing fp to point start of file data 
     fread(buff,file_size,1,fp); 
     printf("Data Read [%s]",buff); 
     fclose(fp); 
     return 0; 
    } 
0

имея буфер 100 байт для чтения файла не является лучшей идеей, как, так как размер файла может быть более 100 байт.

Улучшенный файл io можно сделать, выполнив fgets в файле, если это не тот тип метаданных, который вы хотите прочитать, используя fread.

fgets в цикле while может использоваться, чтобы проверить, может ли его достигнутый EOF или вызов feof использоваться для проверки EOF.

код образца список fgets может выглядеть так:

while (fgets(buf, len, fp)) { 
     printf("%s", buf); 
} 

или образец, который используется с fgets может быть, как это:

while (fread(buf, len, 1, fp) >= 0) { 
     printf("%s\n", buf); 
}