【问题标题】:Loading from file and save to array从文件加载并保存到数组
【发布时间】:2014-04-20 09:54:35
【问题描述】:

我有问题。我有这段代码,第一部分 while 工作我的意思是好的,因为通过调试代码(我打印什么是保存 i 数组,看起来不错)。但是在 for in array inst 我想要什么。

我的文件我有这种格式的名字:

Peter News
Martin Clear
.
.
.

我的代码只打印在最后一行。我尝试在数组中打印其他行,但第一行或最后一行只是最后一行。我尝试everthink,但它不起作用。

下面是简单的代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *soubor;
    char radek[80];
    char *data[100];
    int pos = 0;
    int i;

    soubor = fopen("names.txt","r");

    while(fscanf(soubor,"%[^\n]", radek) != EOF){
        getc(soubor);
        data[pos] = radek;
        printf("%d radek = %s pole = %s \n", pos, radek, data[pos]); // debug
        pos++;
    }

    for(i=0;i<100;i++){
        printf("%s \n",data[i]);
    }

    return 0;
}

【问题讨论】:

  • data[pos] = radek; ,它的内容将是最后一个,都是一样的因为只是复制指针。

标签: c arrays file


【解决方案1】:

很遗憾,如果您不太了解 C,在这方面使用 C 可能不是很直观。

您将各个行存储在radek 缓冲区中,并用每个新行覆盖它。在data 中,您只是一次又一次地保存指向radek 的相同指针,因此最后,您只需打印最后的内容100 次。

您需要使用strdup() 来存储它:

data[pos] = strdup(radek);

这将在堆上分配radek 中字符串的副本并执行您需要的操作。


但是还有更多的问题,比如你应该在使用后使用free() 释放内存是正确的,使用静态大小的缓冲区对于缓冲区溢出也是危险的,没有太多的错误处理等。

你可能想看看例如在答案here 上实现了文本文件行的动态存储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多