0

我在从行分隔的文本文件中加载一些代码时遇到了一些问题,该文件的格式如下:

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

有谁知道出了什么问题???

4

2 回答 2

2

有谁知道出了什么问题???

一、三个连续的问号。

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

三、不要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);

如果您想提高一点效率,请实现动态缓冲区的对数扩展。

于 2013-04-13T05:13:54.803 回答
1

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

该标准(N1256 草案的§7.19.6.2 ¶16,出于好奇)指出:

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

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

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

于 2013-04-13T05:13:56.907 回答