我的fprintf()
返回不可预测的结果。我认为它是返回内存地址号码,而不是内存地址内的数据。有人能看看我的代码并检查一下吗?当我在fprintf()
中使用&source
时,我被告知它是未声明的,当我在函数的顶部声明它时,它不起作用。
#include <stdio.h>
#include <stdlib.h>
int MenuLoop = 0;
int MaxPackets = 4;
int currentPackets= 0;
int menu;
/*********************************************************
* Node to represent a Cat which includes a link reference*
* a link list of nodes with a pointer to a Cat Struct *
* would be better but this is for illustartion only! *
**********************************************************/
struct Packet {
int Source;
int Destination;
int Type;
int Port;
char *Data;
struct Packet *next; // Link to next Cat
};
typedef struct Packet node; // Removes the need to constantly refer to struct
/*********************************************************
* Stubs to fully declared functions below *
**********************************************************/
void outputPackets(node **head);
void push(node **head, node **aPacket);
node* pop(node **head);
void AddPacket();
void AddPacket();
void SavePacket();
void ShowCurrent();
void ExitProgramme();
main() {
do{
Menu();
} while(menu<4);
}
void AddPacket(){
int option;
/*********************************************************
* pointers for the link list and the temporary P to *
* insert into the list *
**********************************************************/
node *pPacket, *pHead = NULL;
/*********************************************************
* Create a cat and also check the HEAP had room for it *
**********************************************************/
pPacket = (node *)malloc(sizeof(node));
if (pPacket == NULL)
{
printf("Error: Out of Memoryn");
exit(1);
}
currentPackets++;
printf("Enter Source Number between 1-1024:n");
scanf("%i", &pPacket->Source);
printf("Enter Destination Number between 1-1024:n");
scanf("%i", &pPacket->Destination);
printf("Enter Type Number between 0-10:n");
scanf("%i", &pPacket->Type);
printf("Enter Port Number between 1-1024:n");
scanf("%i", &pPacket->Port);
printf("Enter Data Numberbetween 1-50:n");
scanf("%s", &pPacket->Data);
printf("Do you want to Enter another Packet?");
pPacket->next = NULL;
/*********************************************************
* Push the Cat onto the selected Link List, the function *
* is written so the program will support multiple link *
* list if additional 'pHead' pointers are created. *
* Who says you cannot herd cats! *
**********************************************************
* NOTE: The push parameters are using references to the *
* pointers to get round the pass by value problem caused *
* by the way C handles parameters that need to be *
* modified *
**********************************************************/
push(&pHead, &pPacket);
pPacket = (node *)malloc(sizeof(node));
if (pPacket == NULL)
{
printf("Error: Out of Memoryn");
exit(1);
}
outputPackets(&pHead);
/*********************************************************
* Display the Link List 'pHead' is passed as a reference *
**********************************************************/
return 0;
do{
if(currentPackets == MaxPackets);
{
printf("Packet limit reached please saven");
}
}while(currentPackets<MaxPackets);
return 0;
}
void outputPackets(node **head)
{
/*********************************************************
* Copy Node pointer so as not to overwrite the pHead *
* pointer *
**********************************************************/
node *pos = *head;
/*********************************************************
* Walk the list by following the next pointer *
**********************************************************/
while(pos != NULL) {
printf("Source: %.4i Destination: %.4i Type: %.4i Port: %.4i n", pos->Source, pos->Destination, pos->Type, pos->Port);
pos = pos->next ;
}
printf("End of Listnn");
}
void push(node **head, node **aPacket)
{
/*********************************************************
* Add the cat to the head of the list (*aCat) allows the *
* dereferencing of the pointer to a pointer *
**********************************************************/
(*aPacket)->next = *head;
*head = *aPacket;
}
node *pop(node **head)
{
/*********************************************************
* Walk the link list to the last item keeping track of *
* the previous. when you get to the end move the end *
* and spit out the last Cat in the list *
**********************************************************/
node *curr = *head;
node *pos = NULL;
if (curr == NULL)
{
return NULL;
} else {
while (curr->next != NULL)
{
pos = curr;
curr = curr->next;
}
if (pos != NULL) // If there are more cats move the reference
{
pos->next = NULL;
} else { // No Cats left then set the header to NULL (Empty list)
*head = NULL;
}
}
return curr;
}
void SavePacket(Source, Destination, Type, Port, Data){
FILE *inFile ;
char inFileName[10] = { ' ' } ;
printf("Input file name : ") ;
scanf("%s", inFileName) ;
//Open file
inFile = fopen(inFileName, "w+");
if (!inFile)
{
fprintf(stderr, "Unable to open file %s", &inFile);
exit(0);
}
fprintf(inFile, "Source: %i Destination: %i Type: %i Port: %i Data: %s n", Source, Destination, Type, Port, Data);
fclose(inFile);
}
void ShowCurrent(){
}
void ExitProgramme(){}
void Menu(){
printf("********Welcome****** n");
printf("Creator Ben Armstrong.nn");
printf("*Please Choose an option*n");
printf("1. Add a new packetn");
printf("2. Save current packet to filen");
printf("3. Show current list of packetsn");
printf("4. Exitn");
scanf("%i", &menu);
switch(menu)
{
case 1:
AddPacket();
break;
case 2:
SavePacket();
break;
case 3 :
ShowCurrent();
break;
case 4 :
ExitProgramme();
break;
}
}
这是你的部分问题…
inFile = fopen(inFileName, "w+");
if (!inFile)
{
fprintf(stderr, "Unable to open file %s", &inFile);
exit(0);
}
我很确定你的意思是…
inFile = fopen(inFileName, "w+");
if (!inFile)
{
fprintf(stderr, "Unable to open file %s", inFileName );
exit(0);
}
还要注意,&inFile
是inFile
变量的地址,而不是存储在FILE指针中的值。
此外,您声明您的函数原型用于保存数据如下…
void SavePacket(Source, Destination, Type, Port, Data)
表示您正在传递Source
, Destination
, Type
, Port
和Data
参数,但显然您的意思是这些是名称,而不是类型,因此编译器假设它们都是整数。你需要给它们一个类型和一个名字…
void SavePacket( int Source, int Destination, int Type, int Port, char* Data)
,现在你可以打印它们…
fprintf(
inFile, "Source: %i Destination: %i Type: %i Port: %i Data: %s n",
Source, Destination, Type, Port, Data
);
但是你有一个更大的混乱,当你声明SavePacket()应该接收参数,但你没有传递参数给它,当你调用它…
case 2:
SavePacket();
break;
应该传递需要打印的变量。类似…
case 2:
SavePacket(
somePacket->Source, somePacket->Destination, somePacket->Type,
somePacket->Port, somePacket->Data
);
break;
但是,你可以这样做更容易…
void SavePacket( struct Packet* packet )
{
...
fprintf(
inFile, "Source: %i Destination: %i Type: %i Port: %i Data: %s n",
packet->Source, packet->Destination, packet->Type,
packet->Port, packet->Data
);
}
然后通过传入数据包来调用它…
case 2:
{
struct Packet somePacket;
GetPacketDataFromSomewhere( &somePacket );
SavePacket( &somePacket );
break;
}