在C ++中读取和解析数据文件的正确方法是什么?

时间:2009-10-06 01:20:22

标签: c++ parsing file-io

在具有混合字符的数据文件中读取什么是有效,正确的方法?例如,我有一个数据文件,其中包含从其他文件,32位整数,字符和字符串加载的数据的混合。目前,我正在使用一个fstream对象,但是一旦它到达int32或字符串的结尾就会被停止。如果我将随机数据添加到数据文件中字符串的末尾,它似乎会跟随文件的其余部分。这让我相信添加到字符串上的空终止会搞砸它。以下是在文件中加载的示例:

void main()
{
    fstream fin("C://mark.dat", ios::in|ios::binary|ios::ate);
    char *mymemory = 0;
    int size;
    size = 0;
    if (fin.is_open())
    {
        size = static_cast<int>(fin.tellg());
        mymemory = new char[static_cast<int>(size+1)];
        memset(mymemory, 0, static_cast<int>(size + 1));

        fin.seekg(0, ios::beg);
        fin.read(mymemory, size);
        fin.close();
        printf(mymemory);
    std::string hithere;
    hithere = cin.get();
    }
}

为什么读取整数或字符串后此代码会停止?怎么可能绕过这个?处理这些类型的文件时这是错误的方法吗?我应该使用fstream吗?

1 个答案:

答案 0 :(得分:3)

你有没有考虑过文件读取是否正常工作,而printf(mymemory)是否在第一个空值处停止?

查看调试器并查看我是否正确。

另外,如果你想打印别人的缓冲区,请使用puts(mymemory)或printf(“%s”,mymemory)。不要接受别人对格式字符串的输入,它可能会导致程序崩溃。

尝试

for (int i = 0; i < size ; ++i)
{
  // 0 - pad with 0s
  // 2 - to two zeros max
  // X - a Hex value with capital A-F (0A, 1B, etc)
  printf("%02X ", (int)mymemory[i]);
  if (i % 32 == 0)
    printf("\n"); //New line every 32 bytes
}

作为以十六进制形式转储数据文件的方法。