使用C,如何从文件中读取特定信息并存储在多个位置

时间:2015-02-19 23:02:07

标签: c file-io dynamic-arrays scanf

我给出了一个文本文件,其中包含有关游戏世界的信息以及此格式的碰撞数据。

 Width 5
 Height 5
 10001
 11000
 11100
 11111
 11111

为了存储数据,我给出了

static int BINARY_MAP_WIDTH;
static int BINARY_MAP_HEIGHT;

static int **MapData; // Dynamic array of map data

我的FileIO knowldege不仅仅是逐行读取文件中的字符串。

到目前为止,我只是在前两行中有这种非常迂回的阅读方式。

FILE *Data;

int line = 1; // line number that we're on

Data = fopen(FileName, "rt");

if (!Data)
    return 0;

if (Data)
{
    while (!feof(Data))
    {
        if (line == 1)
            fscanf(Data, "%*[^0-9]%d%n", &BINARY_MAP_WIDTH);

        if (line == 2)
            fscanf(Data, "%*[^0-9]%d%n", &BINARY_MAP_HEIGHT);

        if (line > 2)
            break;

        line++;
    }
}

说实话,我并不完全确定它为什么会起作用,但我在变量中得到了正确的值。

我知道如何设置动态数组,此时我的问题是读取正确的值。 我不确定从哪里开始。

1 个答案:

答案 0 :(得分:0)

您需要了解有关fscanf

的一些事项
  1. fscanf将消耗所需的字节数来执行 请求转换并相应地更新文件指针。 对fscanf的下一次调用将从文件中的位置开始 前一个fscanf结束的地方。
  2. fscanf会返回成功转化的次数,所以您 应该验证返回值是否等于 请求转换。
  3. 所以这就是我如何重写你目前的代码

    #include <stdio.h>
    
    static int mapWidth;
    static int mapHeight;
    
    int readFromFile( char *name )
    {
        FILE *fp;
        int good = 1;
    
        if ( (fp = fopen(name, "r")) == NULL )
            return 0;
    
        if ( fscanf(fp, "%*[^0-9]%d", &mapWidth) != 1 )
            good = 0;
        if ( fscanf(fp, "%*[^0-9]%d", &mapHeight) != 1 )
            good = 0;
    
        if ( good )
        {
            // the code to read the rest of the file goes here
        }
    
        fclose( fp );
        return good;
    }
    
    int main( void )
    {
        if ( readFromFile( "input.txt" ) )
            printf( "%d %d\n", mapWidth, mapHeight );
        else
            printf( "readFromFile failed\n" );
    }
    

    下一步是找出

    • 如何根据宽度和高度为MapData分配内存
    • 如何读取循环中的其余行,例如使用fgetsfscanf(..."%s"...)
    • 如何解析这些行以填充MapData