我遇到一些代码加载来自行格式文本文件的代码有点麻烦:
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
任何人都知道出了什么问题???
答案 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
,而是返回零。
我应该注意,标准中的示例都使用feof
和ferror
,而不是检查fscanf
的返回值以检查文件结尾。