天天看點

linux寫字元串到檔案,關于linux:我想寫字元串到檔案的頂部。 但它不起作用。(在c中)...

我想寫'ping'的結果。

首先,我編寫指令行,然後..編寫其餘的ping結果。

像這樣。

ping -c5 -W1 192.168.30.52

PING 192.168.30.52(192.168.30.52)56(84)位元組的資料。

來自192.168.30.52的64位元組:icmp_seq = 1 ttl = 64 time = 0.368 ms

來自192.168.30.52的64位元組:icmp_seq = 2 ttl = 64時間= 0.408 ms

來自192.168.30.52的64位元組:icmp_seq = 3 ttl = 64時間= 0.400毫秒

來自192.168.30.52的64位元組:icmp_seq = 4 ttl = 64時間= 0.392 ms

來自192.168.30.52的64位元組:icmp_seq = 5 ttl = 64時間= 0.393毫秒

--- 192.168.30.52 ping統計---

傳輸5個包,5個接收,0%丢包,時間3996ms

rtt min / avg / max / mdev = 0.368 / 0.392 / 0.408 / 0.018 ms

但是這個源結果是...指令行寫的是檔案的結尾..

#include

#include

#include

#include

#include

#include

#define FILE_NAME"ping.txt"

#define doSystem system

void main(void) {

FILE *fp;

char cmdBuf[256], fileBuf[256], buffer[256];

char dst_addr[124] ="192.168.30.52";

struct in_addr ipaddr;

ssize_t read;

size_t len = 0;

if( !inet_aton(dst_addr, &ipaddr) ) {

printf("invalid ip address

");

} else {

sprintf(cmdBuf,"ping -c5 -W1 %s > %s", dst_addr, FILE_NAME );

fp = fopen(FILE_NAME,"a+");

fprintf(fp ,"ping -c5 -W1 %s

", dst_addr);

doSystem(cmdBuf);

fp = fopen(FILE_NAME,"r");

while(fgets(buffer, 255, (FILE*) fp)) {

printf("%s", buffer);

}

}

}

這個結果是

PING 192.168.30.52(192.168.30.52)56(84)位元組的資料。

來自192.168.30.52的64位元組:icmp_seq = 1 ttl = 64 time = 0.368 ms

來自192.168.30.52的64位元組:icmp_seq = 2 ttl = 64時間= 0.408 ms

來自192.168.30.52的64位元組:icmp_seq = 3 ttl = 64時間= 0.400毫秒

來自192.168.30.52的64位元組:icmp_seq = 4 ttl = 64時間= 0.392 ms

來自192.168.30.52的64位元組:icmp_seq = 5 ttl = 64時間= 0.393毫秒

--- 192.168.30.52 ping統計---

傳輸5個包,5個接收,0%丢包,時間3996ms

rtt min / avg / max / mdev = 0.368 / 0.392 / 0.408 / 0.018 ms

ping -c5 -W1 192.168.30.52

我該怎麼辦呢?/?

通過建立新檔案,首先編寫新行,然後附加舊檔案的其餘部分。 最後重新命名為old。 說:這是個壞主意; 始終附加日志檔案,而不是重寫。

嘗試在調用"doSystem"之前添加fclose。

建立臨時檔案并将所有最新的ping結果寫入該檔案,然後将舊檔案資料附加到臨時檔案,然後删除舊檔案并将臨時檔案名重命名為舊檔案名。

我剛剛在"doSystem"之前嘗試過fclose。 但是不要工作。!

在cmdBuf中建立的指令中嘗試">>"而不是">"

有用! 謝謝 !

@Olaf,Ankur你甚至讀過這個問題? 标題有點誤導,但閱讀問題澄清了其他明智之處。

為什麼這個問題被擱置?! T_T對此有什麼不妥...... ?? .....

輸出到檔案是完全緩沖的。 在執行指令之前,需要重新整理緩沖區。

sprintf(cmdBuf,"ping -c5 -W1 %s > %s", dst_addr, FILE_NAME );

fp = fopen(FILE_NAME,"a+");

fprintf(fp ,"ping -c5 -W1 %s

", dst_addr);

fflush(fp);

doSystem(cmdBuf);

謝謝您的回答 !!!!

sprintf(cmdBuf,"ping -c5 -W1 %s >> %s", dst_addr, FILE_NAME );

fp = fopen(FILE_NAME,"w");

fprintf(fp ,"ping -c5 -W1 %s

", dst_addr);

fclose(fp);

doSystem(cmdBuf);

我喜歡這樣。

有用 !

感謝所有評論!

對于未來的讀者,之前發生的事情:當你忘記關閉檔案時,第一行被緩沖,>在開頭寫,而在程式結束時,第一行最後被重新整理。 現在,您使用"w"模式正确打開以删除最終的先前内容,關閉檔案并在檔案末尾正确追加(使用>>)。

不相關:void main()已被棄用了幾十年(應該是int main并且應該傳回環境值),并且總是關閉你打開的流是很好的...

在sprintf中,>替換檔案内容(與"w"模式相同)。 使用>>與"a"模式相同。

#include

#include

#include

#include

#include

#include

#define FILE_NAME"ping.txt"

#define doSystem system

void main(void)

{

FILE *fp;

char cmdBuf[256], fileBuf[256], buffer[256];

char dst_addr[124] ="192.168.0.6";

struct in_addr ipaddr;

ssize_t read;

size_t len = 0;

if( !inet_aton(dst_addr, &ipaddr) )

{

printf("invalid ip address

");

}

else

{

sprintf(cmdBuf,"ping -c5 -W1 %s >> %s", dst_addr, FILE_NAME );

fp = fopen(FILE_NAME,"a+");

fprintf(fp ,"ping -c5 -W1 %s

", dst_addr);

fclose(fp);

doSystem(cmdBuf);

}

}