C++读取txt文本文件的问题

MISAYAONE 2016-11-01 12:23:24
我的txt文件中有#号和\两个符号

并且需要跳过字母读取其中的数字存入我自己定义的变量中

文本格式:

#dkiwjd
#ekdwijd
\dwedui.kwd
w 952
#xmwie
h 852


C++怎么解决 呢?
...全文
360 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
SureGOGOGO 2016-11-02
  • 打赏
  • 举报
回复
一个人个人字符读取,假如是设定字符则跳过。
MISAYAONE 2016-11-01
  • 打赏
  • 举报
回复
引用 1 楼 u010909114 的回复:
如果数字前面的字符是固定格式的,可一行行的读,然后再每行的判断/分割,提出数字。
具体应该怎么做呢?求指教!
花开花折 2016-11-01
  • 打赏
  • 举报
回复
如果数字前面的字符是固定格式的,可一行行的读,然后再每行的判断/分割,提出数字。
hongwenjun 2016-11-01
  • 打赏
  • 举报
回复
https://github.com/hongwenjun/nmea_gprmc
gprmc
本工具从NMEA文件里读取GPRMC的GPS时间戳  BY Hong Wenjun

Usage: gprmc.exe  [NMEA.txt]  [gps.txt]  [8402]

输出文件不填,结果显示在屏幕上
*   WGS-84 和 GCJ-02 的 EMEA 打印转换第三个参数 code 定义
*   02  表示 GCJ-02;
*   84  表示 WGS-84;
*
*   code 定义 默认 8402
*   8484: 输入WGS-84 度分格式, 输出WGS-84 度小数
*   8402: 输入WGS-84 度分格式, 输出GCJ-02 火星坐标
*
*   0202: 输入GCJ-02 火星坐标, 输出GCJ-02 火星坐标
*   0284: 输入GCJ-02 火星坐标, 输出WGS-84 度小数
昨天刚写的读取一行解析,数据格式行尾都有校验码的
// 读取一行GPRMC数据,判断是否是GPRMC数据行
bool read_gprmc(const char* line, gprmc_format& rmc)
{

    char line_buf[BUFSIZ];
    strncpy(line_buf, line, BUFSIZ);

    int chksum = 0;

    if ('$' != line_buf[0]) {
        print_error(1);
        return false;;

    } else {

        char* pch = strrchr(line_buf, '*');
        if (pch != NULL) {
            *pch = '\0';
            rmc.mode = *(pch - 1);
            pch++;
            rmc.chksum = strtol(pch, &pch, 16);
            // printf("%X\n", chksum);

            if (rmc.chksum != checksum(line_buf + 1)) {
                print_error(2);
                return false;;
            }
        } else {
            print_error(3);
            return false;;
        }


        if (strstr(line_buf, ",,"))
            multi_replace(line_buf, ",,", ",|,");

        pch = strtok(line_buf, ",");
        if ((pch != NULL) && !strcmp(pch, "$GPRMC")) {
            // printf("%s\n", pch);    //GPRMC

            pch = strtok(NULL, ",");
            rmc.rcv_time = atof(pch);

            pch = strtok(NULL, ",");
            rmc.status = *pch;

            pch = strtok(NULL, ",");
            rmc.lat = atof(pch);

            pch = strtok(NULL, ",");
            rmc.lat_direct  = *pch;

            pch = strtok(NULL, ",");
            rmc.lon = atof(pch);

            pch = strtok(NULL, ",");
            rmc.lon_direct = *pch;

            pch = strtok(NULL, ",");
            rmc.speed  = atof(pch);

            pch = strtok(NULL, ",");
            rmc.cog  = atof(pch);

            pch = strtok(NULL, ",");
            rmc.date  = atoi(pch);

            // 一般空
            rmc.mag_variation   = 0;
            rmc.mag_var_direct  = 'W';

            rmc.mode = rmc.mode; // 之前已经读到

        } else {
            print_error(4);
            return false;;

        }

    }

    return true;
}
hongwenjun 2016-11-01
  • 打赏
  • 举报
回复
https://github.com/hongwenjun/nmea_gprmc 昨天刚写的读取一行解析,数据格式行尾都有校验码的
// 读取一行GPRMC数据,判断是否是GPRMC数据行
bool read_gprmc(const char* line, gprmc_format& rmc)
{

    char line_buf[BUFSIZ];
    strncpy(line_buf, line, BUFSIZ);

    int chksum = 0;

    if ('$' != line_buf[0]) {
        print_error(1);
        return false;;

    } else {

        char* pch = strrchr(line_buf, '*');
        if (pch != NULL) {
            *pch = '\0';
            rmc.mode = *(pch - 1);
            pch++;
            rmc.chksum = strtol(pch, &pch, 16);
            // printf("%X\n", chksum);

            if (rmc.chksum != checksum(line_buf + 1)) {
                print_error(2);
                return false;;
            }
        } else {
            print_error(3);
            return false;;
        }


        if (strstr(line_buf, ",,"))
            multi_replace(line_buf, ",,", ",|,");

        pch = strtok(line_buf, ",");
        if ((pch != NULL) && !strcmp(pch, "$GPRMC")) {
            // printf("%s\n", pch);    //GPRMC

            pch = strtok(NULL, ",");
            rmc.rcv_time = atof(pch);

            pch = strtok(NULL, ",");
            rmc.status = *pch;

            pch = strtok(NULL, ",");
            rmc.lat = atof(pch);

            pch = strtok(NULL, ",");
            rmc.lat_direct  = *pch;

            pch = strtok(NULL, ",");
            rmc.lon = atof(pch);

            pch = strtok(NULL, ",");
            rmc.lon_direct = *pch;

            pch = strtok(NULL, ",");
            rmc.speed  = atof(pch);

            pch = strtok(NULL, ",");
            rmc.cog  = atof(pch);

            pch = strtok(NULL, ",");
            rmc.date  = atoi(pch);

            // 一般空
            rmc.mag_variation   = 0;
            rmc.mag_var_direct  = 'W';

            rmc.mode = rmc.mode; // 之前已经读到

        } else {
            print_error(4);
            return false;;

        }

    }

    return true;
}
hongwenjun 2016-11-01
  • 打赏
  • 举报
回复
使用 fgets 读取一行, 查找第一个非空字符, 如果 # / 是注释行 如果 不数据比较乱,哪就要从 源头格式化数据了
Sniper_Pan 2016-11-01
  • 打赏
  • 举报
回复
谢邀,试答如下。建议多查查MSDN,有很多示例代码

#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char **argv)
{
	ifstream in;
	in.open("srcdata.txt", ios::in);

	char cTemp;

	string strNumber;
	int nNumber = -1;
	while (in.get(cTemp))
	{
		if (isdigit(cTemp))
		{
			strNumber += cTemp;
		}
		else
		{
			// Custom handle here yourself.
			if (cTemp == '#')
			{

			}
			else if (cTemp == '\\')
			{

			}

			// Trans string to number value if string not empty.
			if (strNumber.length())
			{
				nNumber = atoi(strNumber.c_str());
				cout << "nNumber  = " << nNumber << endl;

				nNumber = -1;
				strNumber.clear();
			}
		}
	}

	if (strNumber.length())
	{
		nNumber = atoi(strNumber.c_str());
		cout << "nNumber  = " << nNumber << endl;
	}

	in.close();
	return 0;
}

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧