2015-10-16 65 views
-2

你好我正在写一个程序,现在从文件中读取值。打印出额外的数字? (C)

它在数值读取,通过与fgets 字符串,然后我想改变其中一个字符串为整数:

#include <stdio.h> 
#include <string.h> 
#include <stdbool.h> 
#include <stdlib.h> 
#define FILSIZE 1024 


typedef struct _node 
{ 
unsigned int uid; 
char *uname; 
struct _node *next; 
} *node; 



int main(int argc, char* argv[]) 
{ 
FILE *pFile; // pointer file 
char currentLine[FILSIZE]; 
bool isListEmpty = true; 
node firstNode = NULL; 

printf("\n\nargc: %d\nargv[0]: %s\nargv[1]: %s\n\n", argc, argv[0], argv[1]); 


if(argc == 1) 
    { 
    pFile = stdin; 
    } 


else if (argc == 2) 
    { 

    char buffer [50];  
    sprintf(buffer, "%s.txt" ,argv[1]); 
    printf("%s", buffer); 
    pFile = fopen(buffer, "r"); 

    } 

    if(pFile == NULL) 
    { 
     printf("Not working"); 


    exit(0); 
    } 

int i=1; 
int nameCounter = 1; 
int colonCounter=0; 


while(!feof(pFile) && fgets(currentLine, sizeof(currentLine), pFile)) 
    { 



unsigned int nameLength; 
unsigned int tempuid; 
unsigned int idstorlek; 
node firstNode = malloc(sizeof(struct _node)); 

char *temporaryString; 
    temporaryString = strtok(currentLine, ":"); 
colonCounter=colonCounter+1; 

//printf(" fungera pls"); 
printf(" %d Namnordning %s \n", nameCounter, temporaryString); 

nameLength = strlen(temporaryString); 
firstNode->uname = malloc((nameLength+1) * sizeof(char)); 
strcpy(firstNode->uname, temporaryString); 




printf("NAMNET: %s \n", temporaryString); 


while(temporaryString != NULL) 
    { 
    printf(" %s \n", temporaryString); 

    if(colonCounter == 3) 
     { 

     int tempuid=atoi(temporaryString); 
     // idstorlek = sizeof(tempuid); 
     // firstNode->uid = malloc(4); 
     printf(" IDN: %d \n", tempuid);    
     firstNode->uid = tempuid; 
     printf("firstNodeid %d", firstNode->uid); 
     } 

    temporaryString = strtok(NULL, ":");   
    colonCounter=colonCounter+1; 
    } 

    if(colonCounter == 6) 
    { 

    // printf("FUNGERAR ID: %d NAMN %s \n", tempuid, firstNode->uname); 

    } 
    printf("%d Row is done \n", i); 
    i=i+1; 
    nameCounter = nameCounter+1; 
    colonCounter = 0; 



} 



}   

但是,当我把它写出来,我得到:

1 Namnordning mr 
NAMNET: mr 
mr 
x 
1171 
IDN: 1171 
firstNodeid 1171 1101 
Mikael R�nnar 
/Home/staff/mr 
/usr/local/bin/tcsh 

1 Row is done 
2 Namnordning axelsson 
NAMNET: axelsson 
axelsson 
x 
12856 
IDN: 12856 
firstNodeid 12856 1101 
Bj�rn Axelsson 
/Home/staff/axelsson 
/usr/local/bin/tcsh 

2 Row is done 
3 Namnordning gabriel 
NAMNET: gabriel 
gabriel 
x 
16928 
IDN: 16928 
firstNodeid 16928 1101 
Gabriel Jonsson 
/Home/staff/gabriel 
/usr/local/bin/tcsh 

3 Row is done 
4 Namnordning set 
NAMNET: set 
set 
x 
12037 
IDN: 12037 
firstNodeid 12037 1101 
Set Norman 
/Home/staff/set 
/usr/local/bin/tcsh 

4 Row is done 
5 Namnordning dahlin 
NAMNET: dahlin 
dahlin 
x 
12928 
IDN: 12928 
firstNodeid 12928 1101 
Fredrik Dahlin 
/Home/staff/dahlin 
/usr/local/bin/tcsh 

5 Row is done 
6 Namnordning fahlgren 
NAMNET: fahlgren 
fahlgren 
x 
17847 
IDN: 17847 
firstNodeid 17847 1101 
Daniel Fahlgren 
/Home/staff/fahlgren 
/usr/local/bin/tcsh 
6 Row is done 

为什么我也会在那里得到1101? 其他tempuid部分只给我正确的ID。 我没有找到正确的内存吗? (我一直在尝试,它只给我奇怪的错误,与idsize部分)。

+0

嗨,乔。欢迎来到堆栈溢出!请稍后阅读介绍[游览]。你可以[编辑]你的问题,并为这个语言添加一个标签? – usr2564301

+0

是的,它在C中,我添加了它。不知道你应该这样做:) – Joe

+0

@Joe发布相关的代码。 – ameyCU

回答

0

这是因为你不冲水你打电话

printf("firstNodeid %d", firstNode->uid); 

的printf商店字符缓冲区后打印缓冲区,而不是写一个字符串,因为它得到他们避免调用的开销尽快标准输出低级write功能太频繁。

而不是调用:

printf("firstNodeid %d\n", firstNode->uid); 

应该解决您的问题,因为"\n"将换行符添加到字符串,并刷新输出。

编辑:你也应该小心类型。您定义tempuidint

int tempuid=atoi(temporaryString); 
// idstorlek = sizeof(tempuid); 
// firstNode->uid = malloc(4); 
printf(" IDN: %d \n", tempuid);    
firstNode->uid = tempuid; 
printf("firstNodeid %d", firstNode->uid); 

但将其定义为在您的节点结构的unsigned int

+0

Flushing是无关紧要的;如果他叫'fflush(stdout);'他会得到相同的结果,因为没有打印换行符。 – Hurkyl

+0

@Hurkyl我完全不同意。 OP很困惑,因为他认为额外的信息正在印刷。实际上,printf并没有将他的第二个ID写入stdout,直到稍后刷新缓冲区。简单地说“添加一个换行符”并不能给他/她发生缓冲的直觉。 当然,在某个时候他/她会看到相同的输出,但混淆的真正原因是缺乏对printf中缓冲区的理解。 – DIMMSum

+0

全部\ n所做的是让1101最终成为一条新线路。我发布了整个代码,但我仍然很困惑它为什么要添加1101。 – Joe

0

通常情况下,您应该发布一个小而完整的示例来演示这种行为(当您这样做时,您经常会发现错误)。

但事实证明,你已经发布了足够的信息来给出一个非常明确的指标:你的代码是而不是打印出一个额外的数字。相反,它只是没有打印换行符;输出的下一段代码将开始写在同一行上。

+0

我会把整个代码我猜。但是每个“节点”都不会发生这种错误。在这里,我会把代码和我在终端中得到的结果 – Joe