【问题标题】:While looping to end of file?循环到文件末尾时?
【发布时间】:2014-06-05 01:20:21
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
//#define true 0

typedef struct
{
    char currency[8];
    int exchangerate;
} randT;


void main()
{
    int i, num;
    char currency1[8], ch;
    FILE *file = fopen("address", "r");

    randT name[7];

    while(fscanf(file, "%i", &name[i].exchangerate) != EOF)/*I think this is where my problem is*/
    {
        fscanf(file, "%s %i", &name[i].currency, &name[i].exchangerate);
        //printf("%s %i\n", currency1, num);
        //if (fscanf(file, "%i", &currency1) == EOF) break;
        printf("%s %i\n", name[i].currency, name[i].exchangerate);
        i++;
    }

    fclose(file);
}

它给出了分段错误(核心转储),我对 fscanf 函数等相当陌生。请帮忙! 我的文本文件如下所示: 杰夫 4 吉娜 5 杰弗里 6 金娜 7 杰夫 8 吉尼娜 9 杰夫兹 10

【问题讨论】:

  • 您的 seg 错误是因为您从未初始化 i
  • 首先使用%d 而不是%i 来读取和打印整数。您还需要学习如何在给定分段错误的情况下进行调试(提示,在 gdb 上阅读,然后尝试 gdb a.out core)。它会告诉你哪条线路出错了。为什么namerandT 类型的?
  • 这很有趣,你的问题看起来很像stackoverflow.com/questions/24049510/…

标签: c while-loop scanf


【解决方案1】:

崩溃的原因是需要初始化int i = 0;。正如你所拥有的,i 是不确定的,所以name[i] 可能是一个大规模的越界访问。

对于fscanf,您对循环的想法基本正确,除了检查!= EOF 不如检查== 1 或您正在阅读的许多项目。如果文件包含无法作为数字处理的内容,则fscanf 将不会返回EOF

但是,这不是读取特定文件的正确方法。你每次都读%i 然后%s %i,但你的文件只包含一个字符串和一个int。改为:

while ( 2 == fscanf(file, "%7s %i", name[i].currency, &name[i].exchangerate) )

在完成i++ 之后,您还需要检查i 是否超出范围(即小于7)。

请注意,name[i].currency 会衰减为指向 char 的指针 - 您不应该将 &amp; 放在上面。此外,您应该使用长度说明符来避免超出数组的末尾。

我会使用循环结构:

for (num_read = 0; num_read < sizeof name / sizeof name[0]; ++num_read)
{
     if ( 2 != fscanf(file,.....
         break;

     printf(....
}

【讨论】:

  • 你能解释一下为什么 name[i].currency 从指向 char 的指针衰减吗?
  • @user3580389 name[i].currency 是一个数组,因此是一个指针。它不会腐烂成任何东西。
  • "请注意,name[i].currency 衰减为指向 char 的指针 - 你不应该在其上加上 &。"另外,我尝试了“while ( 2 == fscanf(file, "%7s %i", name[i].currency, &name[i].exchangerate))" 并打印了所有内容,但似乎跳过了一些项目?
  • 在 C 中,数组与其他变量有不同的行为。如果在预期值时使用数组,则它会衰减为指向第一个元素的指针。因此,尽管name[i].currency 是一个数组,但fscanf 函数会看到指向数组第一个字符的指针(这正是它想要的)。
  • 另外,我尝试了“while ( 2 == fscanf(file, "%7s %i", name[i].currency, &name[i].exchangerate) )" 并打印了所有内容,但是它似乎跳过了一些项目?
猜你喜欢
  • 2014-06-25
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
相关资源
最近更新 更多