Matlab输出%d, %i, %o, %u, %x,% e, %f, %g, %s, %c

本文详细介绍了C语言中的格式化输出,包括%d、%i、%u、%o、%x、%X等用于整数的输出,以及%f、%e、%E、%g、%G等用于小数的格式化。此外,还提到了%c和%s分别用于字符和字符串的打印。了解这些格式化指令对于C语言的编程至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 输出整数
%d or %i都是输出有符号的十进制整数;%u无符号十进制整数;%o无符号八进制整数;%x输出十六进制小写a-f;%X输出十六进制大写A-F;
  • 输出小数
%f定点计数法;%e指数计数法,例如:3.141593e+00;%E同样为指数计数法,例如:3.141593E+00;%g是 %e or %f的紧凑型,即尾部没有0;%G是%E or %f的紧凑型,尾部无0;%bx or %bX、%bo、%bu分别是双精度的十六进制,八进制,十进制表示法;%tx or %tX、%to、%tu分别是单精度十六进制,八进制,十进制表示法;
  • 输出字符
%c单字符表示法;%s字符串表示法。
下面是一段matlab生成的读取导航电文的代码:function navData = readRinexNav(filename) % 检查文件存在性 if ~exist(filename, 'file') error('文件不存在: %s', filename); end % 打开文件 fid = fopen(filename, 'r'); if fid == -1 error('无法打开文件: %s', filename); end % 初始化输出结构 navData = struct(); navData.Header = struct(); navData.Ephemeris = struct(); try % ========== 读取文件头信息 ========== line = fgetl(fid); rinexVersion = 2.0; % 默认版本 while ischar(line) if contains(line, 'END OF HEADER') break; end % 解析RINEX版本 if contains(line, 'RINEX VERSION / TYPE') rinexVersion = sscanf(line(1:9), '%f'); navData.Header.Version = rinexVersion; navData.Header.FileType = strtrim(line(21:40)); end % 解析文件创建信息 if contains(line, 'PGM / RUN BY / DATE') navData.Header.Program = strtrim(line(1:20)); navData.Header.Creator = strtrim(line(21:40)); navData.Header.Date = strtrim(line(41:60)); end % 解析电离层参数 (RINEX 2) if contains(line, 'ION ALPHA') && rinexVersion < 3 ionAlpha = sscanf(line(3:end), '%f %f %f %f'); navData.Header.IonAlpha = ionAlpha; end % 解析电离层参数 (RINEX 3) if contains(line, 'IONOSPHERIC CORR') && rinexVersion >= 3 system = line(1:4); params = sscanf(line(6:end), '%f %f %f %f'); navData.Header.IonosphericCorr.(system) = params; end % 解析时间系统参数 if contains(line, 'TIME SYSTEM CORR') system = line(1:4); params = sscanf(line(6:end), '%f %f %f %f'); navData.Header.TimeSystemCorr.(system) = params; end % 解析跳秒 if contains(line, 'LEAP SECONDS') navData.Header.LeapSeconds = sscanf(line(1:6), '%d'); end line = fgetl(fid); end % ========== 读取卫星轨道数据 ========== % 预分配内存 maxEntries = 10000; % 初始分配大小 navData.Ephemeris.SatelliteID = cell(maxEntries, 1); navData.Ephemeris.Epoch = zeros(maxEntries, 6); % [年, 月, 日, 时, 分, 秒] navData.Ephemeris.ClockBias = zeros(maxEntries, 1); navData.Ephemeris.ClockDrift = zeros(maxEntries, 1); navData.Ephemeris.ClockDriftRate = zeros(maxEntries, 1); navData.Ephemeris.IODE = zeros(maxEntries, 1); navData.Ephemeris.Crs = zeros(maxEntries, 1); navData.Ephemeris.DeltaN = zeros(maxEntries, 1); navData.Ephemeris.M0 = zeros(maxEntries, 1); navData.Ephemeris.Cuc = zeros(maxEntries, 1); navData.Ephemeris.e = zeros(maxEntries, 1); navData.Ephemeris.Cus = zeros(maxEntries, 1); navData.Ephemeris.sqrtA = zeros(maxEntries, 1); navData.Ephemeris.Toe = zeros(maxEntries, 1); navData.Ephemeris.Cic = zeros(maxEntries, 1); navData.Ephemeris.Omega0 = zeros(maxEntries, 1); navData.Ephemeris.Cis = zeros(maxEntries, 1); navData.Ephemeris.i0 = zeros(maxEntries, 1); navData.Ephemeris.Crc = zeros(maxEntries, 1); navData.Ephemeris.omega = zeros(maxEntries, 1); navData.Ephemeris.OmegaDot = zeros(maxEntries, 1); navData.Ephemeris.IDOT = zeros(maxEntries, 1); navData.Ephemeris.CodesL2 = zeros(maxEntries, 1); navData.Ephemeris.GPSWeek = zeros(maxEntries, 1); navData.Ephemeris.L2PFlag = zeros(maxEntries, 1); navData.Ephemeris.SVAccuracy = zeros(maxEntries, 1); navData.Ephemeris.SVHealth = zeros(maxEntries, 1); navData.Ephemeris.TGD = zeros(maxEntries, 1); navData.Ephemeris.IODC = zeros(maxEntries, 1); navData.Ephemeris.TransmissionTime = zeros(maxEntries, 1); navData.Ephemeris.FitInterval = zeros(maxEntries, 1); entryCounter = 0; % 读取导航电文体 while ~feof(fid) line = fgetl(fid); if ~ischar(line), break; end % 跳过空行 if isempty(strtrim(line)), continue; end entryCounter = entryCounter + 1; if entryCounter > maxEntries % 动态扩展数组大小 maxEntries = maxEntries * 2; navData.Ephemeris.SatelliteID{maxEntries} = []; navData.Ephemeris.Epoch(maxEntries, :) = 0; navData.Ephemeris.ClockBias(maxEntries) = 0; navData.Ephemeris.ClockDrift(maxEntries) = 0; navData.Ephemeris.ClockDriftRate(maxEntries) = 0; % 其他参数类似扩展... end % ===== 解析卫星ID和时间 ===== if rinexVersion < 3 % RINEX 2.x 格式 satID = sscanf(line(1:2), '%d'); if satID < 10 navData.Ephemeris.SatelliteID{entryCounter} = ['G0', num2str(satID)]; else navData.Ephemeris.SatelliteID{entryCounter} = ['G', num2str(satID)]; end % 解析历元时间 year = sscanf(line(4:5), '%d'); if year < 80 year = year + 2000; else year = year + 1900; end month = sscanf(line(7:8), '%d'); day = sscanf(line(10:11), '%d'); hour = sscanf(line(13:14), '%d'); minute = sscanf(line(16:17), '%d'); second = sscanf(line(18:22), '%f'); % 读取时钟参数 clockBias = sscanf(line(23:41), '%f'); clockDrift = sscanf(line(42:60), '%f'); clockDriftRate = sscanf(line(61:79), '%f'); else % RINEX 3.x 格式 satSys = line(1); satID = sscanf(line(2:3), '%d'); navData.Ephemeris.SatelliteID{entryCounter} = [satSys, num2str(satID, '%02d')]; % 解析历元时间 year = sscanf(line(5:8), '%d'); month = sscanf(line(10:11), '%d'); day = sscanf(line(13:14), '%d'); hour = sscanf(line(16:17), '%d'); minute = sscanf(line(19:20), '%d'); second = sscanf(line(22:23), '%f'); % 读取时钟参数 clockBias = sscanf(line(24:42), '%f'); clockDrift = sscanf(line(43:61), '%f'); clockDriftRate = sscanf(line(62:80), '%f'); end % 存储时间和时钟参数 navData.Ephemeris.Epoch(entryCounter, :) = [year, month, day, hour, minute, second]; navData.Ephemeris.ClockBias(entryCounter) = clockBias; navData.Ephemeris.ClockDrift(entryCounter) = clockDrift; navData.Ephemeris.ClockDriftRate(entryCounter) = clockDriftRate; % ===== 读取轨道参数 ===== % 第2行 line = fgetl(fid); IODE = sscanf(line(4:22), '%f'); Crs = sscanf(line(23:41), '%f'); DeltaN = sscanf(line(42:60), '%f'); M0 = sscanf(line(61:79), '%f'); % 第3行 line = fgetl(fid); Cuc = sscanf(line(4:22), '%f'); e = sscanf(line(23:41), '%f'); Cus = sscanf(line(42:60), '%f'); sqrtA = sscanf(line(61:79), '%f'); % 第4行 line = fgetl(fid); Toe = sscanf(line(4:22), '%f'); Cic = sscanf(line(23:41), '%f'); Omega0 = sscanf(line(42:60), '%f'); Cis = sscanf(line(61:79), '%f'); % 第5行 line = fgetl(fid); i0 = sscanf(line(4:22), '%f'); Crc = sscanf(line(23:41), '%f'); omega = sscanf(line(42:60), '%f'); OmegaDot = sscanf(line(61:79), '%f'); % 第6行 line = fgetl(fid); IDOT = sscanf(line(4:22), '%f'); CodesL2 = sscanf(line(23:41), '%f'); GPSWeek = sscanf(line(42:60), '%f'); L2PFlag = sscanf(line(61:79), '%f'); % 第7行 line = fgetl(fid); SVAccuracy = sscanf(line(4:22), '%f'); SVHealth = sscanf(line(23:41), '%f'); TGD = sscanf(line(42:60), '%f'); IODC = sscanf(line(61:79), '%f'); % 第8行 (RINEX 2.x) 或 第7行结束 (RINEX 3.x) if rinexVersion < 3 line = fgetl(fid); TransmissionTime = sscanf(line(4:22), '%f'); FitInterval = sscanf(line(23:41), '%f'); else TransmissionTime = 0; FitInterval = 0; end % 存储轨道参数 navData.Ephemeris.IODE(entryCounter) = IODE; navData.Ephemeris.Crs(entryCounter) = Crs; navData.Ephemeris.DeltaN(entryCounter) = DeltaN; navData.Ephemeris.M0(entryCounter) = M0; navData.Ephemeris.Cuc(entryCounter) = Cuc; navData.Ephemeris.e(entryCounter) = e; navData.Ephemeris.Cus(entryCounter) = Cus; navData.Ephemeris.sqrtA(entryCounter) = sqrtA; navData.Ephemeris.Toe(entryCounter) = Toe; navData.Ephemeris.Cic(entryCounter) = Cic; navData.Ephemeris.Omega0(entryCounter) = Omega0; navData.Ephemeris.Cis(entryCounter) = Cis; navData.Ephemeris.i0(entryCounter) = i0; navData.Ephemeris.Crc(entryCounter) = Crc; navData.Ephemeris.omega(entryCounter) = omega; navData.Ephemeris.OmegaDot(entryCounter) = OmegaDot; navData.Ephemeris.IDOT(entryCounter) = IDOT; navData.Ephemeris.CodesL2(entryCounter) = CodesL2; navData.Ephemeris.GPSWeek(entryCounter) = GPSWeek; navData.Ephemeris.L2PFlag(entryCounter) = L2PFlag; navData.Ephemeris.SVAccuracy(entryCounter) = SVAccuracy; navData.Ephemeris.SVHealth(entryCounter) = SVHealth; navData.Ephemeris.TGD(entryCounter) = TGD; navData.Ephemeris.IODC(entryCounter) = IODC; navData.Ephemeris.TransmissionTime(entryCounter) = TransmissionTime; navData.Ephemeris.FitInterval(entryCounter) = FitInterval; end % 裁剪预分配的多余空间 fields = fieldnames(navData.Ephemeris); for i = 1:length(fields) field = fields{i}; if size(navData.Ephemeris.(field), 1) > entryCounter if iscell(navData.Ephemeris.(field)) navData.Ephemeris.(field) = navData.Ephemeris.(field)(1:entryCounter); else navData.Ephemeris.(field) = navData.Ephemeris.(field)(1:entryCounter, :); end end end % 添加时间向量 navData.Ephemeris.MatlabTime = datetime(... navData.Ephemeris.Epoch(:,1), ... navData.Ephemeris.Epoch(:,2), ... navData.Ephemeris.Epoch(:,3), ... navData.Ephemeris.Epoch(:,4), ... navData.Ephemeris.Epoch(:,5), ... navData.Ephemeris.Epoch(:,6)); fclose(fid); % 显示成功信息 fprintf('成功读取导航电文文件: %s\n', filename); fprintf('文件版本: %.1f\n', rinexVersion); fprintf('卫星系统: %s\n', navData.Header.FileType); fprintf('包含 %d 个卫星历书条目\n', entryCounter); catch ME fclose(fid); rethrow(ME); end end 下面是一段读取观测文件的代码function obsData = readRinexObs(filename) % 检查文件存在性 if ~exist(filename, 'file') error('文件不存在: %s', filename); end % 打开文件 fid = fopen(filename, 'r'); if fid == -1 error('无法打开文件: %s', filename); end % 初始化输出结构 obsData = struct(); obsData.Header = struct(); obsData.Observations = struct(); try % ========== 读取文件头信息 ========== line = fgetl(fid); while ischar(line) if contains(line, 'END OF HEADER') break; end % 解析RINEX版本 if contains(line, 'RINEX VERSION / TYPE') obsData.Header.Version = sscanf(line(1:9), '%f'); obsData.Header.FileType = strtrim(line(21:40)); end % 解析观测值类型 if contains(line, '# / TYPES OF OBSERV') numTypes = sscanf(line(1:6), '%d'); types = textscan(line(7:60), '%4s', numTypes); obsData.Header.ObsTypes = strtrim(types{1}); end % 解析接收机位置 if contains(line, 'APPROX POSITION XYZ') pos = sscanf(line(1:60), '%f %f %f'); obsData.Header.ApproxPosition = pos; end line = fgetl(fid); end % 检查头信息完整性 if ~isfield(obsData.Header, 'ObsTypes') || isempty(obsData.Header.ObsTypes) error('头信息中缺少观测值类型'); end numObsTypes = length(obsData.Header.ObsTypes); % ========== 读取观测数据 ========== % 预分配内存 epochCounter = 0; maxEpochs = 10000; % 初始分配大小 obsData.Observations.Time = zeros(maxEpochs, 6); % [年, 月, 日, 时, 分, 秒] obsData.Observations.Satellites = cell(maxEpochs, 1); obsData.Observations.Values = cell(maxEpochs, 1); % 读取观测数据体 while ~feof(fid) line = fgetl(fid); if ~ischar(line), break; end % 读取历元行 if length(line) < 32 continue; % 跳过无效行 end % 解析时间信息 year = sscanf(line(2:5), '%d'); % 检查年份有效性 if isempty(year) continue; % 跳过无效行 end % 此时year肯定非空,可以安全比较 if year < 1900 continue; % 跳过无效年份 end epochCounter = epochCounter + 1; if epochCounter > maxEpochs % 动态扩展数组大小 maxEpochs = maxEpochs * 2; obsData.Observations.Time(maxEpochs, :) = 0; obsData.Observations.Satellites{maxEpochs} = []; obsData.Observations.Values{maxEpochs} = []; end % 解析历元时间 month = sscanf(line(7:8), '%d'); day = sscanf(line(10:11), '%d'); hour = sscanf(line(13:14), '%d'); minute = sscanf(line(16:17), '%d'); second = sscanf(line(18:29), '%f'); epochFlag = sscanf(line(31:31), '%d'); % 只处理正常数据(epochFlag=0) if epochFlag ~= 0 % 跳过异常数据 numSats = sscanf(line(33:35), '%d'); % 跳过卫星列表行 for i = 1:ceil(numSats/12) fgetl(fid); end % 跳过所有卫星的观测值 for s = 1:numSats linesPerSat = ceil(numObsTypes/5); for l = 1:linesPerSat fgetl(fid); end end continue; end % 存储时间信息 obsData.Observations.Time(epochCounter, :) = [year, month, day, hour, minute, second]; % 解析卫星数量 numSats = sscanf(line(33:35), '%d'); if isempty(numSats) || numSats <= 0 || isnan(numSats) || isinf(numSats) % 容错处理 warning('无效卫星数量: %s, 跳过该历元', line(33:35)); continue; end % 读取卫星列表 satList = ''; satLines = ceil(numSats/12); for i = 1:satLines if i == 1 satLine = line(36:end); else satLine = fgetl(fid); end satList = [satList, strrep(satLine, ' ', '')]; % 移除空格 end % 提取卫星ID satellites = cell(numSats, 1); for i = 1:numSats startIdx = (i-1)*3 + 1; satellites{i} = satList(startIdx:startIdx+2); end % 存储卫星列表 obsData.Observations.Satellites{epochCounter} = satellites; % 初始化观测值数组 obsValues = nan(numSats, numObsTypes); % 读取每个卫星的观测值 for s = 1:numSats % 确定每颗卫星需要读取的行数 linesPerSat = ceil(numObsTypes/5); % 读取所有观测值行 satObs = []; for l = 1:linesPerSat line = fgetl(fid); if ~ischar(line) error('文件意外结束'); end % 每行最多5个观测值 for o = 1:5 startIdx = (o-1)*16 + 1; endIdx = min(startIdx+15, length(line)); if startIdx > length(line) break; end % 解析观测值 obsStr = strtrim(line(startIdx:endIdx)); if ~isempty(obsStr) obsVal = sscanf(obsStr, '%f'); if ~isempty(obsVal) satObs = [satObs, obsVal]; else satObs = [satObs, nan]; % 缺失数据 end end end end % 存储观测值 if length(satObs) > numObsTypes obsValues(s, :) = satObs(1:numObsTypes); else obsValues(s, 1:length(satObs)) = satObs; end end % 存储观测值 obsData.Observations.Values{epochCounter} = obsValues; end % 裁剪预分配的多余空间 obsData.Observations.Time = obsData.Observations.Time(1:epochCounter, :); obsData.Observations.Satellites = obsData.Observations.Satellites(1:epochCounter); obsData.Observations.Values = obsData.Observations.Values(1:epochCounter); % 添加观测值类型标签 obsData.Observations.ObsTypes = obsData.Header.ObsTypes; % 添加时间向量 obsData.Observations.MatlabTime = datetime(... obsData.Observations.Time(:,1), ... obsData.Observations.Time(:,2), ... obsData.Observations.Time(:,3), ... obsData.Observations.Time(:,4), ... obsData.Observations.Time(:,5), ... obsData.Observations.Time(:,6)); fclose(fid); catch ME fclose(fid); rethrow(ME); end end请根据这两段代码写一个计算卫星位置的代码
最新发布
07-20
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值