2015-10-16 5 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 только дает мне правильный идентификатор. Я не располагаю память правильно? (Я пытался, и это только дает мне странные ошибки, с частью idsize).

+0

Hi Joe. Добро пожаловать в переполнение стека! Пожалуйста, прочитайте вводный [тур] некоторое время. Можете ли вы отредактировать свой вопрос и добавить тег для языка, в котором он находится? – usr2564301

+0

Да, это в C, я добавил. Не знал, что вы должны были это сделать :) – Joe

+0

@Joe Опубликовать соответствующий код. – ameyCU

ответ

0

Это потому, что вы не очистки буфера печати после вызова

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

PRINTF хранит буфер символов, а не писать строки в стандартный вывод, как только он получает их, чтобы избежать накладных расходов вызвав нижний уровень write функция слишком часто.

Вместо вызова:

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

Если устранить проблему, потому что "\n" добавит новую строку в строку, и промывать выход.

Редактировать: Вы также должны быть осторожны с типами. Вы определения tempuid как int:

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 Я полностью не согласен. ОП был смущен, потому что думал, что печатается дополнительная информация. На самом деле, именно printf не записывал свой второй ID в stdout, пока буфер не был сброшен позже. Просто «добавление новой строки» не дает ему никакой интуиции для буферизации. Несомненно, в определенный момент он/она увидит тот же результат, но истинной причиной путаницы является отсутствие понимания буфера в printf. – DIMMSum

+0

Все \ n делает вывод 1101 на новой строке. Я опубликовал весь код, но я все еще очень смущен тем, почему он добавляет 1101. – Joe

0

Обычно вы должны опубликовать небольшой, полный пример, демонстрирующий поведение (вы часто обнаружите ошибку при выполнении этого).

Но, оказалось, что вы опубликовали достаточно информации, чтобы дать довольно четкий индикатор: ваш код не распечатать дополнительный номер. Вместо этого он просто не распечатывает новую строку; следующий фрагмент кода, который делает вывод, начнет писать на той же строке.

+0

Я поставлю весь код, я думаю. Но эта ошибка не возникает для каждого «узла». Здесь я поставлю код и что получаю в терминале – Joe

Смежные вопросы