![](/img/trans.png)
[英]C- Reading from a file and getting unexpected results when printing contents of it
[英]C- Error reading and printing input from a text file
我在以正确的格式打印信息时遇到问题。 我的程序应该阅读有关航班预订的信息。 该信息应作为行程打印出来,如下所示:
******************* Flight Reservation Request **********************
petem@xyz.net Pete Moss (M 1986/01/01)
123 Boggy Lane
New Orleans, LA 70112
Flight Seats
H100.15005 2
H222.15005 2
H200.15010 2
H333.15010 2
******************* Flight Reservation Request **********************
pcorn@abc.net Pop Corn (M 1957/02/02)
456 Kernel
San Antonio, TX 78210
Flight Seats
H222.15005 1
HXXX.XXXXX 1
H333.15010 1
这是大多数重要的代码。 我只在processReservations()
。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "cs1713p1.h"
FILE *pFileCust; // stream Input for Customer Reservation data
void processCommandSwitches(int argc, char *argv[], char **ppszCustomerFileName);
void processReservations();
int main(int argc, char *argv[])
{
char *pszCustomerFileName = NULL;
// Process the command switches
processCommandSwitches(argc, argv, &pszCustomerFileName);
// open the Customer Reservation stream data file
if (pszCustomerFileName == NULL)
exitError(ERR_MISSING_SWITCH, "-c");
pFileCust = fopen(pszCustomerFileName, "r");
if (pFileCust == NULL)
exitError(ERR_CUSTOMER_RES_FILENAME, pszCustomerFileName);
// process the Reservations
processReservations();
fclose(pFileCust);
printf("\n"); // included so that you can put a breakpoint on this line
return 0;
}
/****** Where my errors are coming from *****/
void processReservations()
{
Customer customer; // student structure for holding student data
FlightRequest flight;
char szInputBuffer[100]; // input buffer for fgets
int iScanfCnt; // scanf returns the number of successful inputs
// read data input lines of text until EOF. fgets returns NULL at EOF
while (fgets(szInputBuffer, 100, pFileCust) != NULL)
{
// if the line is just a line feed, skip it.
if (szInputBuffer[0] == '\n')
continue;
iScanfCnt = sscanf(szInputBuffer, "%1c %10s %50s %30[^\n] %50[^,] %2s %2s %5s %10s %d\n"
, &customer.cGender
, customer.szBirthDt
, customer.szEmailAddr
, customer.szFullName
, customer.szStreetAddress
, customer.szCity
, customer.szStateCd
, customer.szZipCd
, flight.szFlightId
, &flight.iRequestSeats);
// Check for bad input. scanf returns the number of valid conversions
if (iScanfCnt < 10)
{
printf("invalid input when reading data, only %d valid values. \n"
, iScanfCnt);
printf("\tdata is %s\n", szInputBuffer);
//return ERR_MISSING_SWITCH;
}
printf("******************* Flight Reservation Request **********************\n");
printf("%s %s", customer.szEmailAddr, customer.szFullName);
printf("(%c %s)", customer.cGender, customer.szBirthDt);
printf("%s, %s %s\n", customer.szStreetAddress, customer.szCity, customer.szZipCd);
printf(" Flights Seats\n");
printf(" %s %d\n", flight.szFlightId, flight.iRequestSeats);
}
fclose(pFileCust);
}
这是我的部分第一位客户的输出结果:
invalid input when reading data, only 4 valid values.
data is M 1986/01/01 petem@xyz.net Pete Moss
******************* Flight Reservation Request **********************
petem@xyz.net Pete Moss
(M 1986/01/01), a a
Flights Seats
invalid input when reading data, only 4 valid values.
data is 123 Boggy Lane,New Orleans,LA,70112
******************* Flight Reservation Request **********************
Boggy Lane,New Orleans,LA,70112
(1 23), a a
Flights Seats
很长很长,而且很乱,但是我对C还是很陌生,所以必须弄清楚出了什么问题。 一个问题是“航班预订请求”行的打印方式过多。 似乎每次从输入文件读取数据变量时,都会从头开始重复while循环,而我不知道该如何解决。 我在另一个网站上发现了类似的问题,一个用户建议
使用临时变量/结构来测试输入文件所在的行,因此,每次测试文件中的位置时,我都不会覆盖最终的客户结构。 另一个想法是根据我可以从输入文件中得出的假设来构造我的代码。 例如,如果我已经成功读取了新客户的第一行,那么我知道下一行将采用其他格式,因此我不必检查每个后续行是否都是新客户的第一行。
我不知道这些建议的解决方案意味着什么,也不知道如何解决此代码,但是我一直在苦苦挣扎很长时间,没有任何进展。 我的所有变量声明中都包含一个.h文件,但是每个变量名前的小写字母表示该变量是什么数据类型(sz =字符串,c = char,i = int)。 怎么了
程序报告错误
读取数据时输入无效,只有4个有效值
这是因为输入缓冲区
char szInputBuffer[100];
太小。 字段宽度限制的总和
iScanfCnt = sscanf(szInputBuffer, "%1c %10s %50s %30[^\n] %50[^,] %2s %2s %5s %10s %d\n", ...);
大得多。 所以很可能
while (fgets(szInputBuffer, 100, pFileCust) != NULL)
会将每行输入分成几个较小的字符串,您不会检测到这些字符串(缺少尾随newline
)。 但是, sscanf
确实失败。
别mean 使用大量的缓冲液,例如
char szInputBuffer[4096];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.