在C中从文本文件加载到数组
我在从一个格式如下的行分隔文本文件加载某些代码时遇到一些问题:在C中从文本文件加载到数组,c,C,我在从一个格式如下的行分隔文本文件加载某些代码时遇到一些问题: aa bb dd ccasdf dfdsafefasd vdasfeadsaf cvdasegfdjasflfe swedtd 对于数组,我只想得到一个包含文本文件中所有内容的数组。。。这是我的密码: #include<stdio.h> #include<string.h> int main() { int size = 0; char peeps[10000][50]; FIL
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;
}
有人知道出了什么问题吗
有人知道出了什么问题吗
I.连续三个问号
二,<代码>扫描(人物,“%s”,窥视[大小]!=EOF)-如果您只想将文件读入内存,那么永远不要使用scanf()
三、 不要对尺寸使用int
。使用size\u 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);
如果您想要更高效一点,可以实现动态缓冲区的对数扩展
有人知道出了什么问题吗
I.连续三个问号
二,<代码>扫描(人物,“%s”,窥视[大小]!=EOF)-如果您只想将文件读入内存,那么永远不要使用scanf()
三、 不要对尺寸使用int
。使用size\u 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);
如果您想更高效一点,请实现动态缓冲区的对数扩展。尝试将测试从
更改为!=EOF
至>0
本标准(§N1256草案第7.19.6.2¨16条,出于好奇)规定:
如果在任何转换之前发生输入故障,则函数fscanf
将返回宏EOF
的值。否则,该函数将返回分配的输入项的数量,如果早期匹配失败,该数量可以小于提供的数量,甚至可以为零
我怀疑您的C标准库没有将EOF解释为错误条件,因此它没有返回EOF
,而是返回零
我应该注意到,标准中的示例都使用了feof
和ferror
,而不是检查fscanf
的返回值来检查文件结尾。尝试将测试从更改为!=EOF
至>0
本标准(§N1256草案第7.19.6.2¨16条,出于好奇)规定:
如果在任何转换之前发生输入故障,则函数fscanf
将返回宏EOF
的值。否则,该函数将返回分配的输入项的数量,如果早期匹配失败,该数量可以小于提供的数量,甚至可以为零
我怀疑您的C标准库没有将EOF解释为错误条件,因此它没有返回EOF
,而是返回零
我应该注意,标准中的示例都使用feof
和ferror
而不是检查fscanf
的返回值来检查文件结尾。在gdb
中,当文件崩溃时,你能把调用堆栈向上转到main
和print size
吗?我这样做了,这就是它的输出:$1=1936023908Ingdb
,当它崩溃时,你能把调用堆栈向上转到main
和print size
吗?我这样做了,这就是它输出的结果:$1=1936023908当我尝试运行你的代码时,我得到这个错误:错误:使用未声明的标识符“tmp”@JoshuaMcDonald:我认为tmp
和buf
是混淆的。@JoshuaMcDonaldman gcc
修复所有编译器错误(是的,你自己应该可以这么做!),但不管怎样,现在很好。哦,也许不是!我尝试在末尾添加此代码以打印出数组:printf(“%s\n”,result);它什么也没印,只有一个空行。。。我是不是打印错误了,还是有什么不太正确的地方?对不起,我是新手,我不太明白你在说什么:当我试着运行你的代码时,我得到这个错误:错误:使用未声明的标识符“tmp”@JoshuaMcDonald:我认为tmp
和buf
是混淆的。@JoshuaMcDonaldman gcc
修复所有编译器错误(是的,你自己应该可以这么做!),但不管怎样,现在很好。哦,也许不是!我尝试在末尾添加此代码以打印出数组:printf(“%s\n”,result);它什么也没印,只有一个空行。。。我是不是打印错了,还是有什么不对的地方?对不起,我是新手,我不太明白你在说什么:S