- 1 1. परिचय
- 2 2. write फङ्क्शनको मूलभूत
- 3 3. writeफङ्क्शनको प्रयोग उदाहरण
- 4 4. writeफंक्शन रprintfफंक्शनको फरक
- 5 5. फाइल अपरेसनमा write कार्यको प्रयोग
- 6 6. ट्रबलशूटिंग
- 7 7. FAQ
- 7.1 Q1: write फङ्क्शनले स्ट्रिङ लेख्दा ध्यान दिनुपर्ने बुँदाहरू के हुन्?
- 7.2 Q2: write फङ्क्शनको फर्किने मान नकारात्मक भएमा, कसरी सम्बोधन गर्ने?
- 7.3 Q3: write फङ्क्शन र fwrite फङ्क्शन बीचको भिन्नता के हो?
- 7.4 Q4: write फङ्क्शन प्रयोग गर्दा, कसरी डिबग गर्ने?
- 7.5 Q5: फाइल लेख्दा, इच्छित आकारभन्दा कम डाटा मात्र लेखिनुको कारण के हो?
- 7.6 Q6: write फङ्क्शन थ्रेड-सेफ हो?
- 8 8. सारांश
1. परिचय
C भाषा प्रणाली प्रोग्रामिङ र एम्बेडेड प्रणालीहरू जस्ता विभिन्न क्षेत्रमा व्यापक रूपमा प्रयोग हुने शक्तिशाली प्रोग्रामिङ भाषा हो। त्यसै बीच, write
फङ्सन कम स्तरको इनपुट/आउटपुट अपरेसन गर्दा अनिवार्य फङ्सन मध्ये एक हो। यस लेखमा, write
फङ्सनको आधारभूतदेखि अनुप्रयोगसम्मलाई विस्तृत रूपमा व्याख्या गरी, पाठकलाई व्यावहारिक प्रोग्राम निर्माण गर्न सहयोग गर्नेछौं।
2. write
फङ्क्शनको मूलभूत
write
फङ्क्शन के हो?
write
फङ्क्शन C भाषा को सिस्टम कल मध्ये एक हो, फाइल डिस्क्रिप्टर मार्फत डेटा लेख्न प्रयोग गरिन्छ। यो फङ्क्शन प्रयोग गरेर, मानक आउटपुट वा फाइल जस्ता ठाँउहरूमा डेटा सिधै पठाउन सम्भव हुन्छ।
write
फङ्क्शनको परिभाषा
निम्नलिखित write
फङ्क्शनको सिग्नेचर हो।
ssize_t write(int fd, const void *buf, size_t count);
- रिटर्न मान: वास्तविकमा लेखिएको बाइटको संख्या (त्रुटि हुँदा -1 फर्काउँछ)।
- तर्कहरूको व्याख्या:
fd
(फाइल डिस्क्रिप्टर): लेखन गन्तव्यलाई जनाउने पूर्णांक मान। मानक आउटपुट (1
)या मानक त्रुटि(2
)जस्तै … पनि निर्दिष्ट गर्न सकिन्छ।buf
(बफर): लेख्नुपर्ने डेटा भण्डारण गरिएको मेमोरीको ठेगाना।count
(लेखन गर्ने बाइट संख्या): बफरबाट लेखिने डेटाको आकार।
प्रयोग दृश्यहरू
- मानक आउटपुटमा डेटा आउटपुट गर्नुहोस्।
- फाइलमा बाइनरी डेटा वा पाठ भण्डारण गर्नुहोस्।
- एम्बेडेड सिस्टम र OS कर्नेल भित्रको निम्न-स्तरको डेटा सञ्चालन।
त्रुटि ह्यान्डलिङ
write
फङ्क्शनले त्रुटि फिर्ता गर्दा, कारण पत्ता लगाउनको लागि errno
जाँच गर्नुहोस्। तल त्रुटिको उदाहरणहरू छन्।
- EACCES: फाइलमा लेख्न अनुमति छैन।
- EBADFअमान्य फाइल डिस्क्रिप्टर निर्दिष्ट गरिएको छ।
- EFAULT: अवैध बफर ठेगाना निर्दिष्ट गरिएको छ।
त्रुटि ह्यान्डल गर्ने कोड उदाहरण:
if (write(fd, buf, count) == -1) {
perror("write error");
}
3. write
फङ्क्शनको प्रयोग उदाहरण
मानक आउटपुटमा स्ट्रिङ्ग लेखन
write
फङ्क्शनलाई प्रयोग गरेर, मानक आउटपुट(कन्सोल स्क्रिन)मा स्ट्रिङ्ग देखाउने आधारभूत उदाहरण हो।
#include <unistd.h>
int main() {
const char *message = "Hello, World!
";
write(1, message, 14); // 1 ले मानक आउटपुट जनाउँछ
return 0;
}
बुँदा:
1
यो मानक आउटपुटको फाइल डिस्क्रिप्टर हो।- बफर साइजको रूपमा १४ (स्ट्रिङको लम्बाइ) निर्दिष्ट गरिएको छ।
- आउटपुट परिणाम ‘Hello, World!’ हुनेछ।
फाइलमा डेटा लेखन
अर्को, write
फङ्क्शनलाई प्रयोग गरेर फाइलमा डेटा लेख्ने उदाहरण हो।
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd = open("example.txt", O_WRONLY | O_CREAT, 0644);
if (fd == -1) {
perror("open error");
return 1;
}
const char *data = "This is a test.
";
ssize_t bytes_written = write(fd, data, 16);
if (bytes_written == -1) {
perror("write error");
} else {
printf("Successfully wrote %zd bytes.
", bytes_written);
}
close(fd);
return 0;
}
बुँदा:
open
फङ्सन प्रयोग गरेर फाइल खोल्नुहोस्,write
डेटा लेखेर,close
फाइल बन्द गर्नुहोस्।O_WRONLY
लेखन‑केवल हो,O_CREAT
यो विकल्प हो जुन फाइल अवस्थित नभएमा सिर्जना गर्दछ।- अधिकार
0644
मालिकलाई पढ्न‑लिख्न अनुमति दिइन्छ, अन्यलाई मात्र पढ्न अनुमति दिइन्छ।
बाइनरी डेटा लेखन
write
फङ्क्शन बाइनरी डेटा सिधै लेख्ने अवस्थामा पनि प्रयोग गरिन्छ।
#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>
int main() {
int fd = open("binary.dat", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd == -1) {
perror("open error");
return 1;
}
uint8_t buffer[4] = {0xDE, 0xAD, 0xBE, 0xEF}; // 4 बाइटको बाइनरी डेटा
ssize_t bytes_written = write(fd, buffer, sizeof(buffer));
if (bytes_written == -1) {
perror("write error");
} else {
printf("Successfully wrote %zd bytes.
", bytes_written);
}
close(fd);
return 0;
}
बुँदा:
uint8_t
प्रकारको बफर प्रयोग गरेर, हामी ४ बाइटको बाइनरी डेटा लेख्छौं।O_TRUNC
यसलाई निर्दिष्ट गरेर, विद्यमान डेटा हटाइन्छ र नयाँ लेखिन्छ।
ध्यान दिनु पर्ने बुँदा
- लेखन गरिने डाटाको आकार (
count
लाई सही रूपमा निर्दिष्ट गर्न आवश्यक छ। असटीक मान निर्दिष्ट गर्दा, अवांछित डेटा लेखिने सम्भावना हुन्छ। - बफरको मेमोरी ठेगाना वैध छ कि छैन जाँच गर्नुहोस्। अवैध ठेगाना निर्दिष्ट गर्दा सेग्मेन्टेशन फोल्ट हुन्छ।
4. write
फंक्शन रprintf
फंक्शनको फरक
printf
फंक्शनको विशेषता
printf
फंक्शनलाई, ढाँचा सहितको डेटा मानक आउटपुटमा प्रिन्ट गर्न प्रयोग गरिन्छ। तल यसको विशेषताहरू देखाइएका छन्।
- फर्म्याट सुविधा
printf
यो फर्म्याट निर्दिष्टक हो (उदाहरण:%d
,%s
)को प्रयोग गरेर, संख्याहरू र स्ट्रिङहरूलाई फर्म्याट गरेर आउटपुट गर्न सकिन्छ।- उदाहरण:
c int value = 42; printf("The answer is %d ", value);
आउटपुट परिणाम:
The answer is 42
- उच्च-स्तरीय सञ्चालन
printf
यो मानक पुस्तकालयको एक भाग हो, र आन्तरिक रूपमाwrite
हामी फङ्सन प्रयोग गरिरहेका छौं।- आउटपुट डेटा अस्थायी रूपमा बफरमा भण्डारण गरिन्छ र उपयुक्त समयमा लेखिन्छ।
- लक्ष्य केवल मानक आउटपुट हो।
- आउटपुट गन्तव्य मानक आउटपुटमा सीमित छ, र फाइल डिस्क्रिप्टरलाई प्रत्यक्ष रूपमा निर्दिष्ट गर्न सकिँदैन।
write
फंक्शनको विशेषता
write
फंक्शनले, अझै कम स्तरको अपरेसन प्रदान गर्दछ। तल यसको विशेषताहरू छन्।
- फर्म्याट सुविधा छैन
write
यसमा फर्म्याटिङ्ग सुविधा छैन, र निर्दिष्ट गरिएको डेटा त्यसै गरी आउटपुट गर्दछ।- उदाहरण:
c const char *message = "Hello, World! "; write(1, message, 14);
आउटपुट परिणाम:
Hello, World!
- निम्न-स्तरको सञ्चालन
- डेटा तुरुन्तै लेखिन्छ, र बफरिङ् गरिँदैन।
- मानक लाइब्रेरीमा निर्भर नगरी, प्रत्यक्ष रूपमा सिस्टम कलहरूलाई कल गर्दछ।
- लचिलो आउटपुट गन्तव्य
- फाइल डिस्क्रिप्टर प्रयोग गरेर, तपाईंले मानक आउटपुट बाहेक मनपर्ने फाइल वा उपकरणमा डेटा लेख्न सक्नुहुन्छ।
बफरिङको फरक
दुबैको मुख्य फरक भनेको, डेटा बफरिङ विधि हो।
printf
फंक्शन:
डेटा मानक लाइब्रेरीको आन्तरिक बफरमा भण्डारण गरिन्छ, र शर्तहरू पूरा हुँदा एकै पटक लेखिन्छ (उदाहरण: नयाँ लाइनमा वा बफर पूर्ण हुँदा)।- फाइदा: प्रदर्शन सुधार हुन्छ।
- नुकसान: बफर फ्ल्यास नगरेमा डेटा देखिँदैन।
write
फंक्शन:
बफरिङ नगरी, कल गरिँदा प्रत्येक पटक तुरुन्तै डेटा आउटपुट गर्दछ।- फाइदा: यो निश्चित रूपमा तुरुन्तै आउटपुट हुन्छ।
- डेमेरिट: बारम्बार कल गर्दा प्रदर्शन घट्न सक्छ।
प्रयोग बिचको बिन्दुहरू
शर्त | सिफारिस गरिएको फङ्सन | कारण |
---|---|---|
फर्म्याट सहितको आउटपुट आवश्यक छ | printf | तपाईं फर्म्याट स्पेसिफायरहरू प्रयोग गरेर डेटा फर्म्याट गर्न सक्नुहुन्छ। |
तत्कालिक आउटपुट आवश्यक छ | write | बफरिङ बिना तुरुन्तै डेटा लेख्नुहोस् |
फाइल वा डिभाइसमा आउटपुट | write | कुनै पनि फाइल डिस्क्रिप्टरलाई समर्थन गर्न सक्छ |
प्रदर्शन केन्द्रित | printf (शर्तसहित) | मानक आउटपुटमा दक्षतापूर्वक बफरिङ् गर्ने |
उदाहरण प्रयोगमा तुलना
printf
को प्रयोग:
#include <stdio.h>
int main() {
int value = 42;
printf("Value: %d
", value);
return 0;
}
write
को प्रयोग:
#include <unistd.h>
int main() {
const char *message = "Value: 42
";
write(1, message, 10);
return 0;
}
दुबैको नतिजा समान छ, तर आन्तरिक प्रक्रिया धेरै फरक छ भन्ने कुरा बुझ्नु महत्त्वपूर्ण छ।

5. फाइल अपरेसनमा write कार्यको प्रयोग
फाइल खोल्ने र बन्द गर्ने
फाइलमा डेटा लेख्नको लागि, पहिले फाइल खोल्न आवश्यक छ।open
कार्य प्रयोग गरेर फाइल खोल्नुहोस्, र लेख्ने अपरेसन समाप्त भएपछिclose
कार्यले फाइल बन्द गर्नुहोस्।
मूलभूत कोड उदाहरण:
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int fd = open("example.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd == -1) {
perror("open error");
return 1;
}
close(fd);
return 0;
}
मुख्य बुँदा:
O_WRONLY
: फाइललाई लेखन‑केवल मोडमा खोल्छ।O_CREAT
: यदि फाइल अवस्थित छैन भने, नयाँ बनाइन्छ।O_TRUNC
: यदि फाइल अवस्थित छ भने, यसको सामग्री खाली गरिनेछ।- तीस्रो तर्क (
0644
फाइलको पहुँच अधिकार सेट गर्नुहोस्।
फाइलमा डेटा लेख्ने प्रक्रिया
write
कार्य प्रयोग गरेर विशिष्ट लेख्ने उदाहरण देखाइन्छ।
कोड उदाहरण:
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int fd = open("data.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd == -1) {
perror("open error");
return 1;
}
const char *content = "Hello, File!
";
ssize_t bytes_written = write(fd, content, 13);
if (bytes_written == -1) {
perror("write error");
} else {
printf("Successfully wrote %zd bytes.
", bytes_written);
}
close(fd);
return 0;
}
मुख्य बुँदा:
write
फङ्सनले निर्दिष्ट गरेको स्ट्रिङलाई फाइलमा लेख्छ।- रिटर्न मानबाट वास्तविक रूपमा लेखिएको बाइटको संख्या जाँच गरिन्छ।
- यदि त्रुटि हुन्छ भने,
perror
लाई प्रयोग गरेर त्रुटि विवरण देखाइन्छ।
त्रुटि ह्यान्डलिंग र ध्यान दिनुपर्ने बुँदा
फाइल अपरेसनमाwrite
कार्यमा त्रुटि उत्पन्न हुन सक्छ। प्रतिनिधि त्रुटिहरू र तिनीहरूको समाधान तल देखाइन्छ।
- फाइल खोल्न सकिँदैन
open
को त्रुटि)
- कारण: फाइल अवस्थित छैन, वा पहुँच अधिकार पर्याप्त छैन।
- उपाय: सही पथ र उपयुक्त अनुमतिहरू जाँच गर्नुहोस्, र आवश्यक परेमा
O_CREAT
निर्दिष्ट गर्नुहोस्।
- लेखन त्रुटि (
write
को त्रुटि)
- कारण: डिस्क स्थान अपुरो, फाइल सिस्टमको समस्या।
- उपाय: त्रुटि कोड
errno
जाँच गरेर, लगहरू आउटपुट गरेर कारण पत्ता लगाउनुहोस्।
- क्लोज त्रुटि (
close
को त्रुटि)
- कारण: फाइल डिस्क्रिप्टर अवैध छ।
- उपाय: फाइल सहीसँग खुलेको छ कि छैन जाँच गर्नुहोस्।
त्रुटि ह्यान्डलिंग कोड उदाहरण:
if (write(fd, content, 13) == -1) {
perror("write error");
}
फाइल अपरेसनको व्यावहारिक उदाहरण
बहु-लाइनको पाठलाई फाइलमा लेख्ने उदाहरण देखाइन्छ।
कोड उदाहरण:
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int fd = open("multiline.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd == -1) {
perror("open error");
return 1;
}
const char *lines[] = {"Line 1
", "Line 2
", "Line 3
"};
for (int i = 0; i < 3; i++) {
if (write(fd, lines[i], 7) == -1) {
perror("write error");
close(fd);
return 1;
}
}
close(fd);
return 0;
}
मुख्य बुँदा:
- हामी एरे प्रयोग गरेर धेरै पंक्तिको डेटा लेख्छौं।
- हामी लूप भित्र त्रुटि जाँच गरेर सुरक्षा सुनिश्चित गर्छौं।
6. ट्रबलशूटिंग
write
फङ्क्शन -1 फिर्ता गर्छ
कारण:
write
फङ्क्शन -1 फिर्ता गर्दा, त्रुटि देखा पर्छ। सम्भावित कारणका उदाहरणहरू तल देखाइएका छन्।
- अमान्य फाइल डिस्क्रिप्टर
- कारण: फाइल ठीकसँग खोलिएको छैन, वा पहिले नै बन्द गरिएको छ।
- समाधान:
फाइल डिस्क्रिप्टर वैध छ कि छैन जाँच गर्नुहोस्।
c if (fd < 0) { perror("Invalid file descriptor"); return 1; }
- डिस्क स्थान अपुरै छ
- कारण: तपाईंले लेख्न खोज्दै हुनुहुने डिभाइसको स्टोरेज पर्याप्त छैन।
- समाधान: डिस्क क्षमताको जाँच गर्नुहोस्, र पर्याप्त खाली स्थान सुनिश्चित गर्नुहोस्।
- पहुँच अधिकारहरू अपर्याप्त छन्
- कारण: लेखन गन्तव्य फाइल वा निर्देशिकामा आवश्यक अनुमति छैन।
- समाधान:
फाइल वा डाइरेक्टरीको अनुमति परिवर्तन गरिन्छ।
bash chmod u+w फाइल नाम
केही डेटा लेखिँदैन
कारण:
write
फङ्क्शनले निर्दिष्ट बाइट संख्य(count
)जति मात्र डेटा लेख्ने ग्यारेन्टी गर्दैन। विशेष गरी फाइल डिस्क्रिप्टर सॉकेट वा पाइप भएमा, डेटा आंशिक रूपमा मात्र लेखिन सक्छ।
समाधान:
नलेखिएको भागलाई ट्र्याक गर्दै लूपमा प्रक्रिया गर्नुहोस्।
उदाहरण:
#include <unistd.h>
ssize_t robust_write(int fd, const void *buf, size_t count) {
ssize_t total_written = 0;
const char *buffer = buf;
while (count > 0) {
ssize_t written = write(fd, buffer, count);
if (written == -1) {
perror("write error");
return -1;
}
total_written += written;
buffer += written;
count -= written;
}
return total_written;
}
सेग्मेन्टेशन फॉल्ट देखा पर्छ
कारण:
write
फङ्क्शनलाई पास गरिएको बफरको ठेगाना अवैध भएमा, सेग्मेन्टेशन फॉल्ट देखा पर्छ।
समाधान:
- बफरलाई उपयुक्त रूपमा आरम्भ गरिएको छ कि छैन जाँच गर्नुहोस्।
- प्वाइन्टरको मेमोरी आवंटन सही छ कि छैन जाँच गरिन्छ।
उदाहरण(गलत कोड):
char *data;
write(1, data, 10); // data आरम्भ गरिएको छैन
सुधारिएको उदाहरण:
char data[] = "Hello";
write(1, data, 5); // प्रारम्भिक डेटा प्रयोग गर्नुहोस्
लेखन रोकिएछ
कारण:
सिग्नल उत्पन्न हुँदाwrite
फङ्क्शन रोकिएर सक्छ।
समाधान:
त्रुटि कोडEINTR
जाँच गरी, आवश्यक परे पुनः प्रयास गर्नुहोस्।
उदाहरण:
#include <errno.h>
#include <unistd.h>
ssize_t retry_write(int fd, const void *buf, size_t count) {
ssize_t result;
do {
result = write(fd, buf, count);
} while (result == -1 && errno == EINTR);
return result;
}
लेखिएको सामग्री अनपेक्षित नतिजा बनिन्छ
कारण:
- लेखन गर्ने बफरको आकार गलत छ।
- बफरमा अपेक्षित नभएको डेटा समावेश गरिएको छ।
समाधान:
- लेखन गरिने डाटाको आकार सही रूपमा निर्दिष्ट गर्नुहोस्।
- डिबगिङ उपकरण (उदाहरण:
gdb
बफरको सामग्री जाँच गर्न ) प्रयोग गर्नुहोस्।
gdb ./your_program
ट्रबलशूटिंग सारांश
- त्रुटि कोड जाँच गर्नुहोस्
- त्रुटि हुँदा
errno
लाई प्रयोग गरेर कारण पत्ता लगाउँछौं। - उदाहरण:
if (write(fd, buf, size) == -1) { perror("write error"); }
- डिबगिङ विधि
strace
लाई प्रयोग गरेर सिस्टम कलको व्यवहार ट्र्याक गर्ने।- लॉगहरू आउटपुट गरेर समस्या भएको स्थान पहिचान गर्नुहोस्।
7. FAQ
Q1: write
फङ्क्शनले स्ट्रिङ लेख्दा ध्यान दिनुपर्ने बुँदाहरू के हुन्?
A:
write
फङ्क्शनले निर्दिष्ट बाइट सङ्ख्या (count
) जत्तिकै मात्र डाटा लेख्छ, तर स्ट्रिङ शून्य-समाप्त (null-terminated) भएको कुरालाई विचार गर्दैन। त्यसैले, लेख्न चाहिने डाटाको सही आकार निर्दिष्ट गर्न आवश्यक छ।
उदाहरण (गल्ती):
const char *message = "Hello, World!";
write(1, message, sizeof(message)); // प्वाइन्टरको आकार प्राप्त हुन्छ
सुधारिएको उदाहरण:
const char *message = "Hello, World!";
write(1, message, strlen(message)); // सही स्ट्रिङको लम्बाइ निर्दिष्ट गर्नुहोस्
Q2: write
फङ्क्शनको फर्किने मान नकारात्मक भएमा, कसरी सम्बोधन गर्ने?
A:
फर्किने मान -1 भएमा, त्रुटि भएको छ। यस समयमा, errno
जाँच गरेर कारण पहिचान गर्न सकिन्छ। तल सामान्य त्रुटि कोडहरू देखाइएका छन्।
- EACCES: फाइलमा लेख्ने अनुमति छैन।
- ENOSPC: डिस्क क्षमता अपुरै छ।
- EINTR: सिग्नल द्वारा अवरोधित गरियो।
उदाहरण (त्रुटि ह्यान्डलिङ):
if (write(fd, buffer, size) == -1) {
perror("write error");
// आवश्यकता अनुसार त्रुटि कोडलाई लगमा आउटपुट गर्नुहोस्
}
Q3: write
फङ्क्शन र fwrite
फङ्क्शन बीचको भिन्नता के हो?
A:
write
फङ्क्शन र fwrite
फङ्क्शन दुवै डाटा आउटपुट गर्न प्रयोग हुन्छन्, तर निम्न भिन्नताहरू छन्।
विशेषता | write कार्य | fwrite कार्य |
---|---|---|
स्तर | निम्न-स्तरको सिस्टम कल | उच्च-स्तरीय मानक पुस्तकालय कार्यहरू |
बफरिङ | बफरिङ बिना | मानक पुस्तकालयद्वारा बफरिङ |
आउटपुट गन्तव्य निर्दिष्ट गर्ने तरिका | फाइल डिस्क्रिप्टर | FILE * (स्ट्रिम) |
उपयोग उदाहरण | फाइल सिस्टम र सॉकेट | फाइल सञ्चालन (विशेष गरी पाठ प्रक्रिया) |
Q4: write
फङ्क्शन प्रयोग गर्दा, कसरी डिबग गर्ने?
A:
निम्न विधिहरू प्रयोग गर्दा, write
फङ्क्शनका समस्याहरूलाई कुशलतापूर्वक डिबग गर्न सकिन्छ।
strace
कमाण्ड प्रयोग गर्नुहोस्
write
फङ्सनको सिस्टम कलहरू ट्र्याक गरेर, पठाइएका डेटा र त्रुटिहरू जाँच गर्नुहोस्।- उदाहरण:
bash strace ./your_program
- लॉग आउटपुट
- लेखिएको डाटाको सामग्री र आकारलाई प्रोग्राम भित्र लगको रूपमा दर्ता गरिन्छ।
- GDB (डिबगर) प्रयोग गर्नुहोस्
- लेखनको समयमा बफरको सामग्री जाँच गरेर, डाटा सही छ कि छैन जाँच गरिन्छ।
Q5: फाइल लेख्दा, इच्छित आकारभन्दा कम डाटा मात्र लेखिनुको कारण के हो?
A:
write
फङ्क्शनले एकैचोटि लेख्ने डाटा आकार फाइल डिस्क्रिप्टर वा प्रणालीको अवस्थामा निर्भर हुन्छ। उदाहरणका लागि, सकेट वा पाइप प्रयोग गर्दा, बफर आकार सीमाका कारण केही डाटा मात्र लेखिन सक्छ।
समाधान:
अलेखित भागलाई ट्र्याक गर्दै, लूपमा write
दोहोर्याउनुहोस्।
ssize_t robust_write(int fd, const void *buf, size_t count) {
size_t remaining = count;
const char *ptr = buf;
while (remaining > 0) {
ssize_t written = write(fd, ptr, remaining);
if (written == -1) {
perror("write error");
return -1;
}
remaining -= written;
ptr += written;
}
return count;
}
Q6: write
फङ्क्शन थ्रेड-सेफ हो?
A:
write
फङ्क्शन थ्रेड-सेफ मानिन्छ, तर धेरै थ्रेडहरूले एकै फाइल डिस्क्रिप्टरलाई एकैसाथ सञ्चालन गर्दा, डाटा मिश्रित हुन सक्छ।
समाधान:
- सिंक्रनाइज़ेशन मेकानिज्म (जस्तै: म्युटेक्स) प्रयोग गरेर थ्रेडहरू बीचको प्रतिस्पर्धा रोक्नुहोस्।
8. सारांश
यस लेखमा, C भाषा को write
फलनको बारेमा, आधारभूतदेखि उन्नतसम्म, त्रुटि ह्यान्डलिङ्ग र printf
सँगको भिन्नता, ट्रबलशुटिङ्ग सम्म विस्तृत रूपमा व्याख्या गरिएको छ। तल मुख्य बुँदाहरूको पुनरावलोकन गरिन्छ।
write
फलनको महत्व
write
यो फङ्सन निम्न-स्तरको डेटा आउटपुट सम्भव बनाउने सिस्टम कल हो, र यो फाइल, मानक आउटपुट, सॉकेट आदि जस्ता विभिन्न आउटपुट गन्तव्यहरूलाई समर्थन गर्दछ।- फर्म्याटिङ्ग सुविधा छैन, तर तत्काल आउटपुट र बाइनरी डेटा सञ्चालनमा यो अत्यन्तै उपयोगी छ।
आधारभूत प्रयोग विधि
write
फंक्शनको सिग्नेचर र आर्गुमेन्टहरू:
ssize_t write(int fd, const void *buf, size_t count);
fd
: आउटपुट गन्तव्य निर्दिष्ट गर्ने फाइल डिस्क्रिप्टर।buf
: लेखनको लागि डेटा भण्डारण गरिएको बफर।count
: लेखन गरिने बाइटको संख्या।- मानक आउटपुट, फाइल, र बाइनरी डेटा लेखनका उदाहरणहरू मार्फत, मैले यसको लचिलोपन सिकें।
printf
सँगको भिन्नता
write
यो निम्न-स्तरमा प्रत्यक्ष रूपमा आउटपुट गर्दछ, र बफरिङ् गर्दैन।- अर्कोतर्फ,
printf
यो फर्म्याट सुविधा उपलब्ध गराउँछ, र उच्च स्तरको आउटपुट सञ्चालन सम्भव बनाउँछ। - दुवैलाई प्रयोगको आधारमा फरक गरेर प्रयोग गर्ने कुरा महत्त्वपूर्ण छ।
त्रुटि ह्यान्डलिङ्ग र डिबगिङ्ग
write
फङ्सनमा त्रुटि हुँदा,errno
लाई प्रयोग गरेर कारण पत्ता लगाउन सकिन्छ।- सामान्य त्रुटिहरू (अवैध फाइल डिस्क्रिप्टर, डिस्क स्थानको अभाव, पहुँच अधिकारको अभाव आदि) को समाधान गर्ने तरिकाहरू परिचय गरियो।
strace
डिबगिङ टूलहरू प्रयोग गरेर ट्रबलशूटिङलाई दक्षतापूर्वक बनाइ सकिन्छ।
ट्रबलशुटिङ्ग र FAQ
- आंशिक लेखन वा अवरोधित अवस्थामा कसरी प्रक्रिया गर्ने भनेर व्याख्या गरियो, र पुनः प्रयास गर्ने कार्यान्वयन उदाहरण प्रस्तुत गरियो।
- FAQ सेक्शनमा,
write
फङ्सनसँग सम्बन्धित सबै प्रश्नहरूलाई समग्र रूपमा समेटिएको छ।
अर्को चरण
- यो लेखमा सिकिएको
write
फङ्सनको ज्ञानको आधारमा, C भाषाका अन्य सिस्टम कलहरू (उदाहरण:read
,lseek
,close
उनीहरूलाई संयोजन गरेर व्यावहारिक प्रोग्राम बनाउनुहोस्। - फाइल सञ्चालन र सॉकेट संचार जस्ता थप उन्नत अनुप्रयोग उदाहरणहरूमा पनि प्रयास गर्नुहोस्।
@@write
फलनको समझ गहिरो भए, C भाषा मा सिस्टम प्रोग्रामिङ्गको आधारलाई अझ बलियो बनाउन सकिन्छ। यो लेखले तपाईंको प्रोग्रामिङ्ग कौशल सुधारमा सहयोग गर्ने आशा गर्दछ। पढ्नुभएकोमा धन्यवाद!