从文本文件加载到C中的数组

时间:2013-04-13 05:05:37

标签: c

我遇到一些代码加载来自行格式文本文件的代码有点麻烦:

aa
bb
dd
ccasdf
dfdsafefasd
vdasfeadsaf
cvdasegfdjasflfe
swedtd

对于一个数组,我只想得到一个包含文本文件中所有内容的数组......这是我的代码:

#include<stdio.h>
#include<string.h>


int main()
{
    int size = 0;
    char peeps[10000][50];
    FILE *people = fopen("test.txt","r");
    while(fscanf(people,"%s",peeps[size]) != EOF)
{
    size++;
}
fclose(people);
return 0;
}

当我运行它时,我得到一个段错误,我已经查看了gdb吐出的内容,但我无法弄清楚如何解决它...这是gdp打印出来的:

Program received signal SIGSEGV, Segmentation fault.
_IO_vfscanf_internal (s=s@entry=0x804a008, format=format@entry=0x804865f "%s",     argptr=argptr@entry=0xbff85298 "4X\305I", 
    errp=errp@entry=0x0) at vfscanf.c:1073
1073                  *str++ = c;
(gdb) bt
#0  _IO_vfscanf_internal (s=s@entry=0x804a008, format=format@entry=0x804865f "%s", 
    argptr=argptr@entry=0xbff85298 "4X\305I", errp=errp@entry=0x0) at vfscanf.c:1073
#1  0xb7e5564d in __isoc99_fscanf (stream=0x804a008, format=0x804865f "%s") at     isoc99_fscanf.c:35
#2  0x08048581 in main () at fdsa.c:10

任何人都知道出了什么问题???

2 个答案:

答案 0 :(得分:2)

  

任何人都知道出了什么问题???

予。连续三个问号。

II。 scanf(people,"%s",peeps[size]) != EOF) - 如果您只想将文件读入内存,那么 永远不会 使用scanf()

III。不要将int用于尺寸。使用size_t,这是标准库中的一个很好的理由。

FILE *f = fopen("foo.txt", "r");
size_t total_size = 0;
size_t num_bytes = 0;

char buf[0x1000];
char *result = NULL;

while ((num_bytes = fread(buf, 1, sizeof(buf), f)) > 0) {
    char *p = realloc(result, total_size + num_bytes);
    if (p == NULL) {
        fclose(f);
        free(result);
        abort(); // whatever, out of memory
    }

    result = p;
    memcpy(result + total_size, buf, num_bytes);
    total_size += num_bytes;
}

fclose(f);

如果您希望提高效率,请实施动态缓冲区的对数扩展。

答案 1 :(得分:1)

尝试将测试从!= EOF更改为> 0

标准(N1256草案§7.19.6.2¶16,对于好奇的人)说:

  

如果在任何转换之前发生输入失败,fscanf函数将返回宏EOF的值。否则,该函数返回分配的输入项的数量,如果早期匹配失败,则可以少于提供的数量,甚至为零。

我怀疑你的C标准库没有将EOF解释为错误条件,所以它不会返回EOF,而是返回零。

我应该注意,标准中的示例都使用feofferror,而不是检查fscanf的返回值以检查文件结尾。