iT邦幫忙

0

檔案處理的兩個問題

想讓他換行 不過這個問題不曉得出在哪裡
https://ithelp.ithome.com.tw/upload/images/20180709/20110294ozTBusiYh7.png
這是我的程式碼

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <io.h>
#include <sys/stat.h>

int main(void)
{
    int arr[]={12,4,5,6};
    int a=12,b=16;
    int f1;  
    f1=open("C:\\Users\\lochieh\\Desktop\\dev c++\\c\\C HW\\ch12\\hw12_12.bin",O_WRONLY|O_CREAT|O_BINARY,S_IREAD); /* 開啟檔案 */
    
    if(f1!=-1)     /* 檔案開啟成功 */
    {
    	write(f1,arr,sizeof(arr)); /* 將arr陣列寫入f1 */
    	write(f1,&a,sizeof(a));    /* 將a寫入f1 */
    	write(f1,&b,sizeof(b));    /* 將b寫入f1 */
    	close(f1);                 /* 關閉檔案 */
    	printf("檔案開啟成功\n");
    	
	}
	else
	{
		printf("檔案開啟失敗!!\n");
	}
   
    system("pause");
	return 0;
}

另外 要是我把開啟成功的程式碼換成以下

printf("檔案開啟成功");

就會出錯 變成這樣
https://ithelp.ithome.com.tw/upload/images/20180709/20110294sDfwKmnlDJ.png

另一個問題是
寫了一個亂數寫入檔案的程式

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
#include <io.h>
#include <sys/stat.h>
#include <string.h>
int main(void)
{
    int f1;
	f1=open("C:\\Users\\lochieh\\Desktop\\dev c++\\c\\C Prog\\ch12\\rand.txt",O_WRONLY|O_CREAT|O_TEXT,S_IWRITE);
	if(f1!=-1) 
	{
		int i,arr[10];
		char str[3];
		srand(time(NULL));        /* 隨機變數種子 */
		for(i=0;i<10;i++)
		{
            arr[i]=(rand()%64)+1; /* 將隨機變數1~64設值給arr陣列 */
		}
		for(i=0;i<10;i++)
		{
			strcpy(str,itoa(arr[i],str,10));
			write(f1,str,sizeof(str));
		}
		close(f1);
		printf("檔案寫入完成!!\n");
	}
	else
	{
		printf("檔案開啟失敗\n");
	}
    
    system("pause");
	return 0;
}

可是在寫入檔案時,rand.txt裡面的內容有時候會變成亂碼
https://ithelp.ithome.com.tw/upload/images/20180709/20110294PFAthZR6XH.png
重新編譯有時候又變成正常的亂數
https://ithelp.ithome.com.tw/upload/images/20180709/20110294hmlfqxVvEp.png
不明白是否有哪裡寫錯或是邏輯錯誤
還請大家指正 謝謝/images/emoticon/emoticon41.gif

1 個回答

1
richardsuma
iT邦大師 3 級 ‧ 2018-07-09 22:00:26
最佳解答

妳的程式表面上看起來沒有問題,應該是第2及第6行在輸入的時候,
不小心有按到控制字元,但是看不到,將第2及第6行刪掉,重新輸入一次。

如果不行將所有程式 copy 到 notepad++, 再 copy 回 dev c++ 重新編譯,
應該就會正常了。

https://ithelp.ithome.com.tw/upload/images/20180709/20001981Oj0mXr1MXQ.png

看更多先前的回應...收起先前的回應...

感謝 我現在安裝notepad++試試看

我在notepad++重打過一遍了 不過還是一樣
這是devc++編譯器的問題嗎/images/emoticon/emoticon02.gif

我在

printf("檔案開啟成功\n");

這段碼中改寫成

printf("檔案開啟完成\n");

問題就解決了 另外我在試了
將功這個字留下
在印出時會有類似的問題
我猜測是這個字有問題/images/emoticon/emoticon06.gif

謝謝大大的幫忙

第二個問題
write(f1,str,sizeof(str));
應該是 strlen 不是 sizeof。

原來是要填入字節數 這個問題困擾很久了/images/emoticon/emoticon02.gif
感謝大大幫我debug/images/emoticon/emoticon41.gif/images/emoticon/emoticon41.gif

小魚 iT邦好手 1 級 ‧ 2018-07-09 23:38:39 檢舉

說到功這個字,
印象中以前曾經看過PHP的書寫到,
功在輸出的時候會出現問題,
(還有其他字,不過書上是寫這個字,我也只知道這個)
是編碼的問題,
不過如果使用UTF8編碼就不會有問題...

Homura iT邦研究生 3 級 ‧ 2018-07-10 00:02:02 檢舉

小魚
你說的是許功蓋(許蓋功)問題吧?
http://ponsonsun.blogspot.com/2009/04/big5.html

wwx iT邦研究生 1 級 ‧ 2018-07-10 09:02:51 檢舉

因為 "功" 是 "\xA5\x5C"
0x5C 正是 '' 所以先解釋了 \ 這東西
功 就不見 反而出現 n
把程式碼改

printf("檔案開啟成\xA5\x5C\n");

就可以正確執行了

wwx iT邦研究生 1 級 ‧ 2018-07-10 09:08:21 檢舉

printf("檔案開啟成功");

也是因為把功的 \ 和 " 先解釋成 " 這樣
也就是打算 printf出 " 這個字符的意思
那麼對編譯來說這行程式於 printf(" 之後
找不到 " 結尾,所以當然編譯不過

謝謝 小魚 Homurawwx 的補充說明。

在台灣因為 萬碼奔騰 的情況,造成使用中文,偶爾會有衝碼的狀況發生,加上台灣人又喜歡創造文字,常常會讓程式出現不可預測的結果,
只能說 BIG5 非戰之罪啊!

我要發表回答

立即登入回答