2013-04-05 100 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

呀,格式化...... – 2013-04-05 06:27:03

+0

尝试一个事情......做到这一点.. char * buff ...然后printf(“Data Read%s”,buff); ..让我知道它是否工作......我已经解决了我的问题,不完全是多一点点... – 2013-04-05 06:28:56

+0

http://stackoverflow.com/questions/410943/reading-a-text-file-into-an-array-in-c – 2013-04-05 06:29:45

回答

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 – 2013-04-05 06:43:36

4

你忘了复位文件指针这样做之后启动。

fseek(fp, 0, SEEK_END); 

找到大小(file_size)后,请执行此操作。

rewind (fp); 
+0

或者:'fseek(fp,0L,SEEK_SET);' – 2013-04-05 06:32:16

+0

@JonathanLeffler是的。这也将起作用。也许倒带(fp)调用fseek来完成这项工作。 – dejavu 2013-04-05 06:35:28

+1

非常感谢Android Decoded和Jonathan Leffler :) :) – 2013-04-05 06:42:46

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()'的结果,如果打开失败,不要使用它 - 这很好。理论上,你应该检查'malloc()'。你不应该使用'buffer = realloc(buffer,size);'因为如果'realloc()'失败,你就失去了唯一的指向分配内存的指针,因此泄漏了之前分配的内容。我想我会使用'fgets()'或POSIX'getline()'而不是逐个字符的输入。 – 2013-04-05 06:36:32

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); 
}