1

我的程序需要从文件中读取输入。该文件的格式为“int int int”,然后是一些星号,表示您需要在此处停止阅读。我想将它们存储在一个结构数组中,我做到了。但似乎我的程序无法读取输入文件的第一个整数。我用 printf 检查了它,但我对此无能为力。请帮忙。这是代码:

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


struct points{
    int i;
    int x;
    int y;
};
int main(){
    int lines = 0;
    char c, e;
    int i, j, x ,y, a, b, temp ;
    FILE *fp;
    fp = fopen("input.txt", "r");
    if (fp != NULL){
        while ((e = fgetc(fp)) != '*'){                     
            if (c == '\n'){
                lines++;
            }
            fscanf(fp, "%d%d%d", &i, &x, &y);
            struct points pt[lines];
            for (j = 0; j <= lines; j++){
                pt[j].i = i;
                pt[j].x = x;
                pt[j].y = y;
                printf("%d ", pt[j].i);
            }
            for (a = 0; a<=lines; a++){
                for (b = a + 1; b <= lines; b++){
                    if (pt[a].x > pt[b].x){
                        temp = pt[a].x;
                        pt[a].x = pt[b].x;
                        pt[b].x = temp;
                    } 
                }
            }
        }           
    }
    else{
        printf("Cannot open File!\n");      
    }
    printf("lines = %d\n", lines);
    return 0;
}
4

2 回答 2

2

你的代码:

        while ((e = fgetc(fp)) != '*') {                             
            if (c == '\n'){
                lines++;
            }
            fscanf(fp, "%d%d%d", &i, &x, &y);

如果它不是星号,将读取第一个字符并将其丢弃,然后在丢弃的第一个字符之后尝试读取 3 个整数。如果第一个字符是数字,那么看起来您“丢失”(部分)第一个数字。

您还有一个问题,您似乎试图将值读入一个块本地数组pt,该数组存在于while循环的单次迭代中(因此每次迭代都重新创建它没有(垃圾)内容),然后您想使用它在超出范围的循环之后(因此此代码不会编译)。

你想要的可能更像是:

#define MAX_POINTS  100
struct points pt[MAX_POINTS];
int i = 0;
while (i < MAX_POINTS && 3 == fscanf(fp, "%d%d%d", &pt[i].i, &pt[i].x, &pt[i].y)) {
    printf("%d ", pt[i].i);
    i++;
}
for (int a = 0; a <= i; a++) {
    for (int b = a+1; b <= i; b++) {
        :

请注意,这会向上读取整数,直到找到看起来不像整数的东西(例如星号,但可以是其他任何东西,包括文件结尾),而不是在找到星号之前读取。如果您想阅读直到看到星号,您需要决定如何处理既不是星号也不是整数的任何内容。

编辑

对于如何读取数字***,然后在它们之后读取更多数字(可能还有更多星星)的替代问题,您可以使用以下内容:

int val;
char buffer[20];
do {
    /* start of a group */
    while (1 == fscanf(fp, "%d", &val)) {
        /* read an integer within a group */
    }
    /* fp is at EOF or something not an integer. */
    /* so read it and loop if its '***' */
} while (1 == fscanf(" %19[*]", &buf) && !strcmp(buf, "***"));
于 2013-07-10T20:31:04.467 回答
1

您是否尝试过使用格式字符串"%d %d %d"而不是"%d%d%d"(即带空格)?

此外,我还看到了其他几个问题:

  1. 您使用while循环查找'*'行中的第一个,但随后您要求从该位置开始fscanf解析 3 s。通过查看int可能无法找到...int'*'
  2. 您还可以在块的中间声明变量struct points pt[lines];;这不是有效的 C 语法。

一旦你解决了这些问题,问题就可能得到解决。

于 2013-07-10T20:02:02.690 回答