【问题标题】:error using struct in reading from a text file使用结构从文本文件中读取时出错
【发布时间】:2014-01-31 19:51:45
【问题描述】:

我是 C 编程的初学者,并尝试使用 struct 来存储相关变量,然后在主程序中使用它们。但是,当我在不使用 struct 的情况下运行相同的程序时,它运行良好。

代码如下所示,除了分段错误外,没有显示任何编译错误,但没有输出。

#include<stdio.h>

struct test
{
char string1[10000];
char string2[10000];
char string3[10000];
char string4[10000];
}parts;

int main()
{
FILE *int_file;
struct test parts[100000];

int_file=fopen("intact_test.txt", "r");

if(int_file == NULL)
{
    perror("Error while opening the file.\n");
}
else
{
    while(fscanf(int_file,"%[^\t]\t%[^\t]\t%[^\t]\t%[^\n]",parts->string1,parts->string2,parts->string3,parts->string4) == 4)
    {
        printf ("%s\n",parts->string3);
    }
}

fclose(int_file);

return 0;
}

输入文件“intact_test.txt”有以下行: AAAA\tBBBB\tCCCC\tDDDD\n

【问题讨论】:

  • 附带问题:建议将fscanf(int_file,"%[^\t]... 更改为char buf[MAXLINESIZE]; while (fgets(buf, sizeof buf, int_file) != NULL) { ... 然后buf 解析为parts
  • 抱歉无法理解您的建议。如果你能澄清一下,我会很高兴。我想使用 struct,因为可以有几乎 10 个或更多变量,并且它们的大小可能从 5 个字符到 1000 个字符或更多,具体取决于输入文本文件。
  • 文件数据是每个结构1行吗?

标签: c struct


【解决方案1】:

struct test 的每个实例是 40k 所以

struct test parts[100000];

正在尝试在堆栈上分配 4GB。这将失败,导致您的 seg 错误。

您应该尝试减小每个struct test 实例的大小,减少parts 的元素并将其移出堆栈。你可以通过给它静态存储持续时间来最容易地做到这一点

static struct test parts[SMALLER_VALUE];

【讨论】:

  • 另外,您似乎在 main() 中同时拥有一个外部“部件”(大小 40kB)和一个大小为 4GB 的部件数组。由于一切都在 main() 中,因此它可能忽略了外部小部分。
  • 我不知道结构实例的容量,所以随机使用了一个值。对不起..
  • 如果我的输入文件大小发生变化,我应该实际使用什么?我的意思是,我想编写一个通用程序来运行许多可能具有可变大小且程序未知的文本文件。
  • 减小变量大小确实解决了我的问题,并且 %[^\t] 也确实有效。但是,我需要确认根据不同输入文件而变化的可变大小。
  • Should %[^\t] be %[^\t]s - 否。%[ 格式说明符以 ] 结尾。
【解决方案2】:

单个结构占用 40,000 个字节,而您有 100,000 个。这相当于 4,000,000,000 字节,或大约 4GB。我对你出现段错误并不感到惊讶

请重新考虑你在做什么。您是否认真尝试读取 4 个字符串,每个字符串 10,000 个字符?

【讨论】:

  • 我使用了一个随机数,没有意识到单个结构的容量。我想要的是使用最高容量,因为我的输入文件大小可能会改变,我不想一次又一次地重写我的程序。请提出解决方法。
  • 减小大小确实解决了我的问题,但实际上我的字符串可能非常非常大或非常小(根据不同的输入文件而有所不同),那么我的可变大小应该是多少?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 2021-11-10
相关资源
最近更新 更多