Чаму гэты код з дапамогай Printf і COUT мае чаканы вынік?

У мяне ёсць наступны код:

int main ()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);    

    for (int i = 0; i < 3; i++) {
        cout << i << " ";
        printf("%d ", i);
    }

    cout << endl;
    return 0;
}

Чаканы вынік гэтага кода:

<�Код> 0 0 1 1 2 2

але, замест гэтага, ён друкуе:

0 1 2
0 1 2

Гэтая праблема ўзнікае ў GNU G ++ 4.9.2 кампілятара

12
Вы выключыў сінхранізацыю сябе і спытаць, чаму яны не сінхранізуюцца%)
дададзена аўтар RiaD, крыніца
Вы выключыў сінхранізацыю сябе і спытаць, чаму яны не сінхранізуюцца%)
дададзена аўтар RiaD, крыніца
Вы выключыў сінхранізацыю сябе і спытаць, чаму яны не сінхранізуюцца%)
дададзена аўтар RiaD, крыніца
Асобныя буферы?
дададзена аўтар Kerrek SB, крыніца
Асобныя буферы?
дададзена аўтар Kerrek SB, крыніца
@KerrekSB, што менавіта гэта і я не хачу, каб скрасці адказ ад вас. Printf і соиЬ выкарыстоўваць асобныя буферы, якія вымываюцца ў розны час. У выпадку прыведзенага вышэй кода, соиЬ, хутчэй за ўсё, прадзьмухвалі ў лініі, і Printf продувают ў канцы выкліку. Замяніць прастору ў Printf з чымсьці іншым (_), і вы ўбачыце яго.
дададзена аўтар IdeaHat, крыніца
@KerrekSB, што менавіта гэта і я не хачу, каб скрасці адказ ад вас. Printf і соиЬ выкарыстоўваць асобныя буферы, якія вымываюцца ў розны час. У выпадку прыведзенага вышэй кода, соиЬ, хутчэй за ўсё, прадзьмухвалі ў лініі, і Printf продувают ў канцы выкліку. Замяніць прастору ў Printf з чымсьці іншым (_), і вы ўбачыце яго.
дададзена аўтар IdeaHat, крыніца
@KerrekSB, што менавіта гэта і я не хачу, каб скрасці адказ ад вас. Printf і соиЬ выкарыстоўваць асобныя буферы, якія вымываюцца ў розны час. У выпадку прыведзенага вышэй кода, соиЬ, хутчэй за ўсё, прадзьмухвалі ў лініі, і Printf продувают ў канцы выкліку. Замяніць прастору ў Printf з чымсьці іншым (_), і вы ўбачыце яго.
дададзена аўтар IdeaHat, крыніца
Дадаць fflush (стандартны вывад) ?
дададзена аўтар Columbo, крыніца
Дадаць fflush (стандартны вывад) ?
дададзена аўтар Columbo, крыніца
Дадаць fflush (стандартны вывад) ?
дададзена аўтар Columbo, крыніца
Гэтае пытанне не мае сэнсу; якія маюць відавочна дэ-сінхранізаваныя стандартныя патокі з STDIO, вы пытаецеся, чаму яны паводзяць сябе так, як быццам яны былі дэ-сінхранізуюцца?
дададзена аўтар T.C., крыніца
Гэтае пытанне не мае сэнсу; якія маюць відавочна дэ-сінхранізаваныя стандартныя патокі з STDIO, вы пытаецеся, чаму яны паводзяць сябе так, як быццам яны былі дэ-сінхранізуюцца?
дададзена аўтар T.C., крыніца
Гэтае пытанне не мае сэнсу; якія маюць відавочна дэ-сінхранізаваныя стандартныя патокі з STDIO, вы пытаецеся, чаму яны паводзяць сябе так, як быццам яны былі дэ-сінхранізуюцца?
дададзена аўтар T.C., крыніца
@ T.C. Пытанне не мае асаблівага сэнсу, калі вы сапраўды ведаеце, што адбываецца, я маю на ўвазе, што выклік ios_base :: sync_with_stdio (хлусня) на самой справе. Можа быць, гэтая лінія тут толькі для павышэння прадукцыйнасці аперацый уводу/высновы з выкарыстаннем CIN/COUT
дададзена аўтар Reynaldo Aguilar, крыніца
@ T.C. Пытанне не мае асаблівага сэнсу, калі вы сапраўды ведаеце, што адбываецца, я маю на ўвазе, што выклік ios_base :: sync_with_stdio (хлусня) на самой справе. Можа быць, гэтая лінія тут толькі для павышэння прадукцыйнасці аперацый уводу/высновы з выкарыстаннем CIN/COUT
дададзена аўтар Reynaldo Aguilar, крыніца
@ T.C. Пытанне не мае асаблівага сэнсу, калі вы сапраўды ведаеце, што адбываецца, я маю на ўвазе, што выклік ios_base :: sync_with_stdio (хлусня) на самой справе. Можа быць, гэтая лінія тут толькі для павышэння прадукцыйнасці аперацый уводу/высновы з выкарыстаннем CIN/COUT
дададзена аўтар Reynaldo Aguilar, крыніца

15 адказы

Адно з магчымых тлумачэнняў гэтага з'яўляецца тое, што соиЬ і Printf выкарыстоўваць асобныя буферы. <�Код> соиЬ выводзіць на экран тэрмінала, альбо калі ён скідаецца з дапамогай епсИ каманды, або калі буфер запоўнены (звычайна 512 байт).

Я не ўпэўнены, што Printf (так што не саромейцеся, папраўце мяне, калі я памыляюся), але таксама варта падобныя паводзіны. Так што ж адбываецца, што ў канцы праграмы, як буферы скідаюцца, і таму выхад вы бачыце дасягаюцца.

Я пабег код на маёй машыне (GCC 4.8.1) разам з мадыфікацыяй, як паказана ніжэй

cout << i << " . ";
printf("%d ", i);

Выхад Я назіраў быў 0 1 2 0. 1. 2. , які, здаецца, паказвае, што PRINTF флешы першы ў маім выпадку. Я паняцця не маю, калі гэта дызайн (згадваецца дзесьці ў стандарце), або, калі гэта залежыць ад кантэксту.

10
дададзена
Упэўнены, соиЬ таксама прамывае для пераносу радкоў, хоць большасць IStreams не робяць.
дададзена аўтар Mooing Duck, крыніца
@MooingDuck: З таго, што я прачытаў, соиЬ флешь для пераносу радкоў пры вывадзе на інтэрактыўнае прылада, напрыклад, тэрмінал, але не змыць пры запісе ў файл.
дададзена аўтар therainmaker, крыніца

Адно з магчымых тлумачэнняў гэтага з'яўляецца тое, што соиЬ і Printf выкарыстоўваць асобныя буферы. <�Код> соиЬ выводзіць на экран тэрмінала, альбо калі ён скідаецца з дапамогай епсИ каманды, або калі буфер запоўнены (звычайна 512 байт).

Я не ўпэўнены, што Printf (так што не саромейцеся, папраўце мяне, калі я памыляюся), але таксама варта падобныя паводзіны. Так што ж адбываецца, што ў канцы праграмы, як буферы скідаюцца, і таму выхад вы бачыце дасягаюцца.

Я пабег код на маёй машыне (GCC 4.8.1) разам з мадыфікацыяй, як паказана ніжэй

cout << i << " . ";
printf("%d ", i);

Выхад Я назіраў быў 0 1 2 0. 1. 2. , які, здаецца, паказвае, што PRINTF флешы першы ў маім выпадку. Я паняцця не маю, калі гэта дызайн (згадваецца дзесьці ў стандарце), або, калі гэта залежыць ад кантэксту.

10
дададзена
Упэўнены, соиЬ таксама прамывае для пераносу радкоў, хоць большасць IStreams не робяць.
дададзена аўтар Mooing Duck, крыніца
@MooingDuck: З таго, што я прачытаў, соиЬ флешь для пераносу радкоў пры вывадзе на інтэрактыўнае прылада, напрыклад, тэрмінал, але не змыць пры запісе ў файл.
дададзена аўтар therainmaker, крыніца

Адно з магчымых тлумачэнняў гэтага з'яўляецца тое, што соиЬ і Printf выкарыстоўваць асобныя буферы. <�Код> соиЬ выводзіць на экран тэрмінала, альбо калі ён скідаецца з дапамогай епсИ каманды, або калі буфер запоўнены (звычайна 512 байт).

Я не ўпэўнены, што Printf (так што не саромейцеся, папраўце мяне, калі я памыляюся), але таксама варта падобныя паводзіны. Так што ж адбываецца, што ў канцы праграмы, як буферы скідаюцца, і таму выхад вы бачыце дасягаюцца.

Я пабег код на маёй машыне (GCC 4.8.1) разам з мадыфікацыяй, як паказана ніжэй

cout << i << " . ";
printf("%d ", i);

Выхад Я назіраў быў 0 1 2 0. 1. 2. , які, здаецца, паказвае, што PRINTF флешы першы ў маім выпадку. Я паняцця не маю, калі гэта дызайн (згадваецца дзесьці ў стандарце), або, калі гэта залежыць ад кантэксту.

10
дададзена
Упэўнены, соиЬ таксама прамывае для пераносу радкоў, хоць большасць IStreams не робяць.
дададзена аўтар Mooing Duck, крыніца
@MooingDuck: З таго, што я прачытаў, соиЬ флешь для пераносу радкоў пры вывадзе на інтэрактыўнае прылада, напрыклад, тэрмінал, але не змыць пры запісе ў файл.
дададзена аўтар therainmaker, крыніца

Па змаўчанні ў C STDIO функцый Printf і г.д. і C ++ IO патокі сінхранізуюцца азначае, што яны могуць быць выкарыстаны як узаемазаменныя. У пачатку кода вы выдалілі сінхранізацыю з ios_base :: sync_with_stdio (хлусня) не ўпэўнены, што калі фактычная мэта была, каб напісаць гэты ios_base :: sync_with_stdio (ісціна) які сінхранізуе дзве Io бібліятэкі.

8
дададзена

Па змаўчанні ў C STDIO функцый Printf і г.д. і C ++ IO патокі сінхранізуюцца азначае, што яны могуць быць выкарыстаны як узаемазаменныя. У пачатку кода вы выдалілі сінхранізацыю з ios_base :: sync_with_stdio (хлусня) не ўпэўнены, што калі фактычная мэта была, каб напісаць гэты ios_base :: sync_with_stdio (ісціна) які сінхранізуе дзве Io бібліятэкі.

8
дададзена

Па змаўчанні ў C STDIO функцый Printf і г.д. і C ++ IO патокі сінхранізуюцца азначае, што яны могуць быць выкарыстаны як узаемазаменныя. У пачатку кода вы выдалілі сінхранізацыю з ios_base :: sync_with_stdio (хлусня) не ўпэўнены, што калі фактычная мэта была, каб напісаць гэты ios_base :: sync_with_stdio (ісціна) які сінхранізуе дзве Io бібліятэкі.

8
дададзена

паспрабуйце гэта

    cout << i << " " <
5
дададзена

паспрабуйце гэта

    cout << i << " " <
5
дададзена

паспрабуйце гэта

    cout << i << " " <
5
дададзена

Калі вы хочаце, каб выснову станд :: соиЬ і Printf , каб быць сінхранізаваныя, вы павінны будзеце выкарыстоўваць:

std::ios_base::sync_with_stdio(true);

ня

std::ios_base::sync_with_stdio(false);

Глядзіце гэта працуе на http://ideone.com/7sgH2I .

3
дададзена

Калі вы хочаце, каб выснову станд :: соиЬ і Printf , каб быць сінхранізаваныя, вы павінны будзеце выкарыстоўваць:

std::ios_base::sync_with_stdio(true);

ня

std::ios_base::sync_with_stdio(false);

Глядзіце гэта працуе на http://ideone.com/7sgH2I .

3
дададзена

Калі вы хочаце, каб выснову станд :: соиЬ і Printf , каб быць сінхранізаваныя, вы павінны будзеце выкарыстоўваць:

std::ios_base::sync_with_stdio(true);

ня

std::ios_base::sync_with_stdio(false);

Глядзіце гэта працуе на http://ideone.com/7sgH2I .

3
дададзена

Вы, верагодна, прапусціце ўпоравень() станд :: соиЬ . <�Код> Е() мае рознае паводзіны адносна гэтага. Акрамя таго, буферы ўводу-вываду павінны быць сінхранізаваныя. Калі вы зменіце код

int main() {
    ios_base::sync_with_stdio(true);//Synchronizing the IO buffers
                                    //must be enabled
    cin.tie(NULL);    

    for (int i = 0; i < 3; i++) {
        cout << i << " ";
        cout.flush();//<<<<<<<<<<
        printf("%d ", i);
    }

    cout << endl;
    return 0;
}

ён павінен паводзіць сябе, як вы чакалі. Глядзіце працоўны дэма тут калі ласка.

1
дададзена
@ReynaldoAguilar я ўсталяваў яе.
дададзена аўтар πάντα ῥεῖ, крыніца
Яна вырабляе той жа вынік
дададзена аўтар Reynaldo Aguilar, крыніца

Вы, верагодна, прапусціце ўпоравень() станд :: соиЬ . <�Код> Е() мае рознае паводзіны адносна гэтага. Акрамя таго, буферы ўводу-вываду павінны быць сінхранізаваныя. Калі вы зменіце код

int main() {
    ios_base::sync_with_stdio(true);//Synchronizing the IO buffers
                                    //must be enabled
    cin.tie(NULL);    

    for (int i = 0; i < 3; i++) {
        cout << i << " ";
        cout.flush();//<<<<<<<<<<
        printf("%d ", i);
    }

    cout << endl;
    return 0;
}

ён павінен паводзіць сябе, як вы чакалі. Глядзіце працоўны дэма тут калі ласка.

1
дададзена
@ReynaldoAguilar я ўсталяваў яе.
дададзена аўтар πάντα ῥεῖ, крыніца
Яна вырабляе той жа вынік
дададзена аўтар Reynaldo Aguilar, крыніца

Вы, верагодна, прапусціце ўпоравень() станд :: соиЬ . <�Код> Е() мае рознае паводзіны адносна гэтага. Акрамя таго, буферы ўводу-вываду павінны быць сінхранізаваныя. Калі вы зменіце код

int main() {
    ios_base::sync_with_stdio(true);//Synchronizing the IO buffers
                                    //must be enabled
    cin.tie(NULL);    

    for (int i = 0; i < 3; i++) {
        cout << i << " ";
        cout.flush();//<<<<<<<<<<
        printf("%d ", i);
    }

    cout << endl;
    return 0;
}

ён павінен паводзіць сябе, як вы чакалі. Глядзіце працоўны дэма тут калі ласка.

1
дададзена
@ReynaldoAguilar я ўсталяваў яе.
дададзена аўтар πάντα ῥεῖ, крыніца
Яна вырабляе той жа вынік
дададзена аўтар Reynaldo Aguilar, крыніца