我目前正在處理行程,并且在將 char 讀取和寫入檔案時遇到了問題。
這個想法是我們有幾個行程應該從檔案中讀取一個整數,增加它并寫回。這是我的嘗試:(我不會包括錯誤檢查)
...
char n;
char buff[5];
int number;
...
read(my_desc, &n, 1);
number = (int)n;
number ;
sprintf(buff, "M", number);
write(my_desc, buff, sizeof(buff));
...
該檔案很簡單
0
但輸出似乎不正確(幾乎總是垃圾)。
我已經閱讀了寫和閱讀手冊,但我一無所知。我已經檢查了一些關于堆疊溢位的讀寫函式的主題,但它們中的大多數要么對我不起作用,要么我難以實作。
提前致謝。
uj5u.com熱心網友回復:
看來您正在讀取單個字符,獲取該字符的ASCII 代碼并將該數字轉換為 4 個字符的字串,然后將這 4 個字符和終止的空字符寫回檔案。
根據您在評論部分提供的資訊,這不是故意的。如果我理解正確,你寧愿
- 將整個檔案作為字串讀取,
- 將該字串轉換為數字,
- 增加那個數字,
- 將該數字轉換回字串,然后
- 用該字串覆寫整個檔案。
步驟#1 可以通過函式來??完成read。但是,您應該讀入整個檔案而不是僅讀取單個字符。
步驟#2可以通過使用函式來完成strtol。
步驟#3 是微不足道的。
步驟#4 可以使用函式來完成snprintf。
步驟#5 可以通過使用函式倒帶檔案lseek,然后使用函式來完成write。
我假設檔案中表示的數字在 a 的可表示范圍內long int,這-9,223,372,036,854,775,808在 9,223,372,036,854,775,807大多數 POSIX 平臺上都是如此。這意味著字串的長度最多可以為 19 個字符,其中 20 個字符包括終止的空字符。這就是為什么我使用的緩沖區大小為20.
char buffer[20], *p;
ssize_t bytes_read;
long num;
bytes_read = read( my_desc, buffer, (sizeof buffer) - 1 );
if ( bytes_read <= 0 )
{
//TODO: handle input error
}
//add null terminating character to string
buffer[bytes_read] = '\0';
//attempt to convert the string to a number
num = strtol( buffer, &p, 10 );
//check for conversion error
if ( p == buffer )
{
//TODO: handle conversion error
}
//increment the number
num ;
//write incremented number to buffer
snprintf( buffer, sizeof buffer, "%ld", num );
//rewind file
lseek( my_desc, 0, SEEK_SET );
//write buffer to file
write( my_desc, buffer, strlen(buffer) );
請注意,我尚未測驗此代碼。
另請注意,此程式假定輸入檔案不包含任何前導零。如果檔案包含文本字串"003",則此程式將用 a 覆寫第一個字符4,但保留檔案中剩余的字符不變。如果這是一個問題,那么您將不得不添加一個呼叫ftruncate來截斷檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/468821.html
下一篇:查找除數的遞回演算法,不使用回圈
