我在使用函數getline /與fgets的問題,跳過輸入。我試圖從stdin讀取文件,然後處理它。雖然它的工作原理只是在openSUSE GCC 4.8.5細,它不Arch Linux的使用gcc 7和最新的Ubuntu與海灣合作委員會5後面的工作會簡單地跳過輸入幾行。 (我正在管道相同的文件)。在這個例子中,我的程序在管道時會跳過第三行和第四行,而手動輸入時則不會。與更大的文件相同的東西只有總是相同的行被跳過。有什麼想法嗎?不勝感激。謝謝。çfgets和函數getline從標準
輸入的形式爲(每行後跟一個換行符):
0 1 2
2 3 4
3 4 5
2 4 5
1 2 3
1
2
3
我的代碼如下所示:
int main(int argc, char *argv[]) {
int bytes;
size_t nbytes = 100;
char *str = (char *) malloc(nbytes+1); // 1 byte for \0
long i = 0;
node *itemArray = malloc(sizeof(itemArray));
while ((bytes = getline(&str, &nbytes, stdin) != -1)) {
char* token;
char *rest = str;
int callNums = 0;
long from = 0;
long to = 0;
long weight = 0;
while((token = strtok_r(rest, " ", &rest))) {
if(callNums == 0) {
from = atol(token);
}
if(callNums == 1) to = atol(token);
if(callNums == 2) weight = atol(token);
callNums++;
}
if(callNums == 3) {
if(i == 0) {
itemArray[i].from = from;
itemArray[i].to = to;
itemArray[i].weight = weight;
printf("%li %li %li \n", itemArray[i].from, itemArray[i].to, itemArray[i].weight);
}
if(i > 0) {
node *tmp = realloc(itemArray, (i * sizeof(itemArray)));
if(tmp) {
itemArray = tmp;
itemArray[i].from = from;
itemArray[i].to = to;
itemArray[i].weight = weight;
printf("%li %li %li \n", itemArray[i].from, itemArray[i].to, itemArray[i].weight);
}
else { printf("realloc failed");
exit(-1); }
}
++i;
}
}
}
free(str);
free(itemArray);
return(0);
}
你確定這個例子是代表?我沒有看到任何'fgets()'。 – EOF
我將代碼從'fgets()'更改爲'getline',認爲我可以通過這種方式解決問題。無論我使用哪個代碼,我的代碼都會跳過這兩行代碼。我應該提到這一點。我很抱歉。 – markus
,讓'getline'分配內存,我將添加隨機內容,其中實際讀取的輸入應該是。 – markus