我正在尝试读取一个有几百行的文件。每一行看起来大致如此(请记住,这些不是实际的数字。只是格式的一个样本。) R 111.1111 222.2222 123456 11 50.111 51.111
我尝试用fscanf读取这个文件然后打印出一些值,但是当我打印出值时,我得到的所有变量都是0。我已检查过该文件,并且所有变量的所有行都没有值为0。我是用C ++写的。
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char** argv)
{
FILE *myfile;
myfile = fopen("tmp.txt", "r");
string type;
float dx;
float dy;
float intensity;
int nsat;
float rmsy;
float rmsx;
if (myfile == NULL) exit(1);
else
{
while ( ! feof (myfile) )
{
fscanf(myfile,"%s %f %f %f %i %f %f\n",&type, &dx, &dy, &intensity, &nsat, &rmsx, &rmsy);
printf("F %f %f %f %i %f %f\n", dx, dy, intensity, nsat, rmsx, rmsy);
}
}
}
答案 0 :(得分:1)
您可以使用std::ifstream
注意此代码假设输入文件格式良好且一个规则上没有值
#include <fstream> //for ifstream
#include <string> //for strings
ifstream stream ( "tmp.txt", ios::in );
string type;
float dx;
float dy;
float intensity;
int nsat;
float rmsy;
float rmsx;
while ( stream >> type){
stream >> dx;
stream >> dy;
stream >> intensity;
stream >> rmsy;
stream >> rmsx;
cout << type << '\t'
<< dx << '\t'
<< dy << '\t'
<< intensity <<'\t'
<< rmsy << '\t'
<< rmsx << endl;
}
并使用input.txt =
R 111.1111 222.2222 123456 11 50.111
T 111.1111 222.2222 123456 11 50.111
这再打印出来,注意这是更惯用的C ++。
输出=
R 111.111 222.222 123456 11 50.111
T 111.111 222.222 123456 11 50.111
答案 1 :(得分:0)
您的代码存在多个问题,但是:
问题是格式字符串开头的%s
。 %s
匹配整行,因此包含所有值。
也许您可以使用%c
代替,如果您确定,数字前只有一个字符。
另请注意,您已将std::string
- 指针传递给scanf
。这是无效的,因为scanf
需要char
缓冲区来存储字符串(%s
),这根本不是一个好主意,因为您不知道所需的缓冲区长度
这对我有用:
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char** argv)
{
FILE *myfile;
myfile = fopen("tmp.txt", "r");
char type;
float dx;
float dy;
float intensity;
int nsat;
float rmsy;
float rmsx;
// The NULL-if should be here, but left out for shortness
while ( ! feof (myfile) )
{
fscanf(myfile,"%c %f %f %f %i %f %f",&type, &dx, &dy, &intensity, &nsat, &rmsx, &rmsy);
printf("F %f %f %f %i %f %f\n", dx, dy, intensity, nsat, rmsx, rmsy);
}
}