使用sscanf从文件C ++中读取空格分隔符

时间:2014-05-12 03:43:53

标签: c++ file scanf

#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <conio.h>

using namespace std;
int main(int argc, char* argv[])
{
ifstream ifile;
char fName[30][30];
long int uTime[30][10];
ifile.open("sync.log");
char ch;
string str = "";
if(ifile.fail())
{
    cout<<"Invalid File Name!";
    system("pause");
    exit(1);

}
int i = 0;
while(!ifile.eof())
{
    getline(ifile, str);
    cout<<str<<endl;
    sscanf(str.c_str(),"%ld %[^\n]",&uTime[i],fName[i]);

    i++;
    str = "";

}

ifile.close();
system("pause");    
cout<<"Output:"<<endl;
for(i = 0 ;  i < 2 ; i ++)
{
    cout<<uTime[i]<<"   ";
    cout<<fName[i];
    cout<<endl;
}


getch();
return 0;

}

文件: sync.log
格式:
1399865017 Test1.txt
1399865017 Test1.txt
所以这是我的完整代码,我在根目录中有sync.log文件,VC ++保存了项目...
从文件中读取后,它必须像这样存储在数组中  uTime [0] = 1399865017;
 fName [0] =“Test1.txt”;
 fName [1] =“Test1.txt”;

上面的代码我得到了
uTime [0] = 0012F6B0和fName [0] =“Test1.txt”

我想要这个uTime [0] = 1399865017;
 fName [0] =“Test1.txt”;

2 个答案:

答案 0 :(得分:1)

我认为您打算使用:

long int uTime[30];

而不是

long int uTime[30][10];

这样,将数据读入uTime的行和将uTime写入cout的行是有意义的。

答案 1 :(得分:0)

鉴于你有:

long int uTime[30][10];

当你这样做时:

cout << uTime[i] << …

您正在打印指向10 long数组的指针。该指针的格式为十六进制;这就是你得到十六进制输出的原因。

你需要修正sscanf()电话 - 你有&uTime[i]的虚假论点 - 以及输出。由于不清楚为什么uTime是一个2D数组,所以不容易告诉你如何修复它,但最简单的解决方案是从数组定义中删除[10]