Ghi dữ liệu .txt trong C++

Chào mọi người.
Trong quá trình chạy code thì file lưu .txt ra kết quả trễ hơn file .exe , có cách nào cho xuất hiện dữ liệu đồng thời không?
Khi em ngưng chạy code, dừng toàn bộ thì kết quả 2 file mới đồng loạt giống nhau. Vậy trong quá trình chạy code, em muốn sử dụng dữ liệu của file .txt làm input cho hoạt động khác không ?
Code của em bên dưới, mong mọi người giúp đỡ !!!

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <cmath>
#include <time.h>

#include "dpcdecl.h"
#include "depp.h"
#include "dmgr.h"

using namespace std;

unsigned char  data[1];
unsigned int x[7], i, sum, t_start;

static HIF hif = hifInvalid;


unsigned int Interval = 1;
unsigned int TotalTime = 5000;
unsigned int t = 0;

int main()
{   //fprintf(stderr,"Opening\n");
    if(!DmgrOpen(&hif, "Basys2")) // Change in "Basys2" for the other board.
    {printf("DmgrOpen failed (check the device name you provided)\n"); return 0;}
    //fprintf(stderr,"Enabling\n");
    if(!DeppEnable(hif)) {printf("DeppEnable failed\n"); return 0;}
    //fprintf(stderr,"Outputting\n");

    data[0] = 1; DeppPutRegRepeat(hif, 8, data, sizeof(data), fFalse); //8 for reset

    data[0] = Interval; DeppPutRegRepeat(hif, 7, data, sizeof(data), fFalse);// 7 for Interval
    ofstream savefile;
    savefile.open("C:/Users/phuc/Desktop/hdk.txt");
    data[0] = 0; DeppPutRegRepeat(hif, 9, data, sizeof(data), fFalse);	// 9 for stop
    data[0] = 0; DeppPutRegRepeat(hif, 8, data, sizeof(data), fFalse);


    DeppGetRegRepeat(hif, 0, data, sizeof(data), fFalse);
    t_start = data[0];

    while(t < TotalTime)
    {
     if (GetAsyncKeyState(VK_ESCAPE))
	{cout << "Cancel processing\n";
	 t = TotalTime;
	}
     else
     {i=1;
     DeppGetRegRepeat(hif, 0, data, sizeof(data), fFalse); x[0] = data[0];
     if (x[0]-t_start != 0)
      {while (i < 7)
	{DeppGetRegRepeat(hif, i, data, sizeof(data), fFalse); x[i] = data[0]; i++;}
	 sum = 16777216*x[6] + 65536*x[5] + 256*x[4] + x[3];
	 t = 65536*x[2] + 256*x[1] + x[0];
	 cout << t << "\t" << sum <<'\n';
	 savefile << t << "\t" << sum << '\n';
	 t_start = x[0];
      }
     }
    }
    data[0] = 1; DeppPutRegRepeat(hif, 9, data, sizeof(data), fFalse);
    if( (hif) != hifInvalid ){DeppDisable(hif); DmgrClose(hif);}
    system("pause"); return 0;
}

Code khó đọc quá bạn ơi, bạn có thể sửa lại code không

1 Like

HI huynhtanphuc.
Bạn có thể tìm hiểu thêm về cơ chế thao tác với file. Việc trễ là không thể chánh khỏi chưa kết notepad nó cũng không cập nhật liên tục.
Còn việc " Vậy trong quá trình chạy code, em muốn sử dụng dữ liệu của file .txt làm input cho hoạt động khác không ?" Ý bạn là hoạt động khác của chương trình khác hay của chính nó.
VD 1 chương trình ghi và một chương trình khác đoc. Hay một chương trình cả đọc cả ghi ?

P/S Chưa bao giwof gặp tình trạng này.

mình nêu hiện tượng, bằng hình ảnh ở trên, có cách nào xử lý để không bị tình trạng giống vậy. Code thì bạn chú ý từ đoạn ofstream savefile; … trở xuống. Cảm ơn bạn đã quan tâm nhé !

1 ghi, 1 chương trình khác đọc nhưng bằng ngôn ngữ labview !

HI huynhtanphuc.
Hệ thống tập tin không được thiết kế cho việc truyền tin giữa các tiến trìn nên nếu bạn có dùng nó sai mục đích thì không đạt được hiệu quả mong muốn và phát sinh các lỗi không cần thiết. Thương để tra đổi dữ liệu bạn có thể dùng pipe hoặc socket.

P/S Bạn có thể nói rõ bài toán để mọi người có cái nhìn tổng quát để đưa ra giải pháp phù hợp nhấ.

Cảm ơn anh đã quan tâm !
Từ tín hiệu bên ngoài - thiết bị xử lý tín hiệu - truyền lên máy tính - sử dụng code ở trên để nhận tín hiệu xử lý - xuất ra file - dùng labview viết giao diện lấy dữ liệu từ file .txt

Thứ nhất: Bản thân file sinh ra là để lấy kết quả của một quá trình và sau đó có thể mở và dùng nhiều lần chứ không phải để đồng bộ hoá. Thế nên việc bạn muốn nó ghi ra liên tục với tốc độ bằng với màn hình console vốn không có chức năng lưu trữ là một chuyện khá là không tưởng, trừ khi bạn làm chậm đi quá trình xuất ra màn hình cho tương đồng với việc xuất ra file.

Thứ 2: Để đảm bảo việc xuất ra file luôn được cập nhật, bạn sẽ phải làm chậm quá trình xuất file bằng việc liên tục đóng - mở filestream. Mở ra → ghi 1 dòng → đóng lại. Trong vòng lặp tiếp theo lại Mở ra → ghi 1 dòng → đóng lại. Đảm bảo không có dữ liệu tồn dư trong buffer.

Thứ 3: nếu muốn nghiên cứu truyền dữ liệu giữa 2 ứng dụng khác nhau, bạn nên dùng thử socket. Chi tiết lập trình thế nào thì mình không biết, tại mình không học ngôn ngữ nào khác ngoài C# và ngay cả C# mình cũng không học socket

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?