在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=1936023908In
gdb
,当它崩溃时,你能把调用堆栈向上转到
main
print size
吗?我这样做了,这就是它输出的结果:$1=1936023908当我尝试运行你的代码时,我得到这个错误:错误:使用未声明的标识符“tmp”@JoshuaMcDonald:我认为
tmp
buf
是混淆的。@JoshuaMcDonald
man gcc
修复所有编译器错误(是的,你自己应该可以这么做!),但不管怎样,现在很好。哦,也许不是!我尝试在末尾添加此代码以打印出数组:printf(“%s\n”,result);它什么也没印,只有一个空行。。。我是不是打印错误了,还是有什么不太正确的地方?对不起,我是新手,我不太明白你在说什么:当我试着运行你的代码时,我得到这个错误:错误:使用未声明的标识符“tmp”@JoshuaMcDonald:我认为
tmp
buf
是混淆的。@JoshuaMcDonald
man gcc
修复所有编译器错误(是的,你自己应该可以这么做!),但不管怎样,现在很好。哦,也许不是!我尝试在末尾添加此代码以打印出数组:printf(“%s\n”,result);它什么也没印,只有一个空行。。。我是不是打印错了,还是有什么不对的地方?对不起,我是新手,我不太明白你在说什么:S